Javascript:将函数指针放入对象中?

标签 javascript node.js pointers scope function-pointers

环顾四周后,我找不到这个问题的答案,尽管我怀疑以前有人问过这个问题。我能找到的最接近的是这个 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/

相关文章:

javascript - 删除 npm 包时会发生什么?

css - SASS-Loader无法正确解析SCSS文件

c - 修改链表中的头指针

javascript - 安装 c3 以在带有 ES6 导入的 webpack 项目中使用的正确步骤是什么?

javascript - 计数事件然后使用throttle/debounce来执行事件

java - 如何使用java在网页上执行javascript

node.js - 有没有办法将调试代码排除在 React Native 的发布版本之外?

javascript - Knockout.js 将新项目添加到数组中

c - C中的指针与递归

C:寻址链表内部结构