环顾四周后,我找不到这个问题的答案,尽管我怀疑以前有人问过这个问题。我能找到的最接近的是这个 Function pointers in objects尽管它并没有完全符合我的要求。
假设我们有这样一段代码:
var foo = function () { /* some code */ };
现在,我假设在评估期间,名称 foo 在其环境中绑定(bind)到函数的内部表示,然后在应用期间查找。
现在假设我们稍后在程序中有一个对象:
var obj = {};
obj.func = foo;
此时,环境中应该有同一个函数对象的两个副本,一个绑定(bind)到foo,另一个绑定(bind)到obj.func。但是假设我不想要该函数的两个副本,而是让 obj.func 指向 foo——有没有办法做到这一点? 这是我想出的:
var obj = {};
obj.func = function () { foo(); };
这行得通吗?有没有更好的办法?
非常感谢
编辑澄清
抱歉——我认为我说得不够清楚。我希望这会有所帮助。
我不确定 Javascript 评估过程是如何工作的,但假设它跟踪一些内部表示的环境,我们将在这里抽象地表示为一组键值对。
现在,当评估者看到一些代码,例如
var foo = function () { /* some code */ };
它在它的环境中构造它:['foo':[函数对象]]。然后,稍后,当它看到类似这样的内容时:
var bar = foo;
它在环境中查找 foo 以检索它的值,一个函数对象,然后像这样扩充环境。 ['foo':[函数对象],'bar':[函数对象]]。 现在,相同的功能确实在环境中出现了两次。这是 javascript 设置环境的方式吗?如果不是,那它是怎么做到的?
我提问的动机如下。假设我们定义了一些函数,然后定义了一个对象,我们将其导出为这些函数的接口(interface),并且我们知道我们将对其进行多次实例化。如果对象包含指向函数的指针而不是函数本身,效率会更高。
最佳答案
JS变量、对象属性等不直接持有对象;他们持有对对象的引用。当你说 var foo = function() { };
时,foo
被分配了一个对你刚刚定义的函数的引用。 (顺便说一句,不是指针。差异可能很微妙,但很重要。JS 没有用户可见的指针,所以这不是什么大问题。但是有的语言使用它们的方式不同。不要让自己以后必须忘掉一些东西。)
稍后在程序中,当您说 obj.func = foo;
时,您正在将 reference 复制到 obj.func
.不是函数——仍然只有一个函数对象,有两个对它的引用。
所以 obj.func = foo;
已经做了你说的。当您调用 obj.func()
时,它实际上调用的是 foo
引用的完全相同的函数。但是,有一个巨大的区别,这可能是给您带来麻烦的原因:obj.func
是一个“方法调用”,而 JS 将 this
设置为 obj
函数内部。如果 foo
正在使用 this
做任何事情,假设它是其他对象,它会感到失望。
如果这是一个问题,你可以做类似的事情
var that = this;
var foo = function() { /* use `that` instead of `this` here */ };
然后,无论您将函数调用为 foo
还是 obj.func
,它都不会受到更改后的 this
的影响。
如果这没有帮助,您需要澄清问题。
关于Javascript:将函数指针放入对象中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11838988/