有没有一种方法可以将JS对象转换为函数?

3
可能重复:
如何在JavaScript中将“对象”转换为函数? 我有一个理论问题。据我所知,{}对象来自Object,并且函数也从那里继承。有没有什么用户可访问的东西可以使{}对象像函数一样可调用,还是这是解释器的魔法?
我想到的是:
var myobj = {}
myobj["__call"] = function() {do_things();}
myobj();

能否使其工作?如果可以,为什么不行?谢谢!

1
我可能错了,但我认为这是不可能的,因为 Javascript 引擎缺乏运算符重载。 - sternr
1
https://dev59.com/wnVD5IYBdhLWcg3wAGeD - Barış Uşaklı
我认为你不能这样做,因为没有办法将代码存储在变量中。你必须定义一个包含代码的新函数,然后你就有了一个新函数,这不是你想要的 :P - Van Coding
1
搜索 StackOverflow 上的 JavaScript 可调用对象 以查看一些不同的技术。 - user113716
黑骑士,非常有用的信息,谢谢你。 - Stavros Korokithakis
1个回答

4

有没有办法将JS对象转换为函数?

没有。

所有的函数都是对象,但并不是所有的对象都是函数。如果一个对象本身不是一个函数,那么“调用”它的意义是什么呢?


相关文章:函数对象和可调用对象有什么区别?

以下是我在下面的评论中提到的(因为这对OP特别有用):

如果一个函数具有内部[[Call]]方法,则该函数是可调用的。请参见ECMA-262 §9.11和§13.2.1以及第34页上的表9。但是,据我所知,您无法将[[Call]]方法添加到没有此方法的对象中。


这听起来像是一个宗教性的回答。"调用"一个对象的意思是将其变成一个"可调用"的对象。由于函数也是一个对象,这意味着它有一些使它成为可调用的东西,因此,如果语言/解释器暴露了它,我们可以将其附加到一个对象上,并将其变成一个可调用的对象。 - Stavros Korokithakis
1
根据我链接的问题,如果一个函数具有内部[[Call]]方法,则可以调用该函数。请参见[ECMA-262 §9.11和§13.2.1](http://www.ecma-international.org/publications/standards/Ecma-262.htm),以及第34页上的表9。但是,据我所知,您无法为尚未具有[[Call]]方法的对象添加该方法。 - Matt Ball
这样解释更好,谢谢。那么问题只在于解释器没有暴露/能够添加[[Call]]方法了,谢谢。 - Stavros Korokithakis
此外,我认为暴露[[Call]]方法(比如作为一个属性)会导致必须将一个属性设置为函数以实例化一个函数的副作用。 - Stavros Korokithakis
我不太清楚“必须”这个词,更多的是“能够”。关键是,如果你想让它可调用,就从一个function开始。 - Matt Ball

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接