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

Zac*_*ham 4 javascript

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

我有以下内容:

function a(func){
    return func.call()
}
Run Code Online (Sandbox Code Playgroud)

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

function a(func){
   var tmp = func.call;
   var res = tmp()
   return res;
}
Run Code Online (Sandbox Code Playgroud)

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

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

还有其他功能会触发类似的错误吗?

有没有办法解决这个问题,除了根本不这样做?

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

a = { toString: null }.propertyIsEnumerable
a("toString")
Run Code Online (Sandbox Code Playgroud)

抛出同样的错误.

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

hug*_*omg 5

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

 var f = obj.mymethod;
 f();
Run Code Online (Sandbox Code Playgroud)

你可以做

 var f = obj.mymethod.bind(obj);
 f();
Run Code Online (Sandbox Code Playgroud)