为什么不能将函数的调用成员分配给变量

时间:2016-06-21 17:14:47

标签: javascript

我正在为项目编写代码转换器,并遇到了一个不寻常的边缘情况。

我有以下内容:

function a(func){
    return func.call()
}

由于各种原因,代码转换器想要将其更改为:

function a(func){
   var tmp = func.call;
   var res = tmp()
   return res;
}

然而,tmp()的来电回复tmp is not a function。如果我只是通过这一行调试和暂停,tmp被定义为一个函数。

它是否与function call(){ [native code]}的签名有关?

是否有其他功能会触发类似的错误?

有没有办法绕过这个,除了根本不这样做?

编辑: 我找到了另一个案例,看起来可能与对象的上下文有关:

a = { toString: null }.propertyIsEnumerable
a("toString")

引发同样的错误。

编辑:一些背景; 我正在编写代码转换器,它有一个非常具体的用例,其中代码的每一行都被分成了它最简单的组件部分。我可能无法将其进一步分开。使用上面的例子,func.call()是一个成员访问操作,后跟一个调用表达式,我想将成员访问和调用表达式分成两个单独的表达式。

1 个答案:

答案 0 :(得分:5)

如果要将方法存储在变量中,而不是执行

 var f = obj.mymethod;
 f();

你可以做到

 var f = obj.mymethod.bind(obj);
 f();