我正在为一个项目编写一个代码转换器,并遇到了一个不寻常的边缘情况.
我有以下内容:
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()是一个成员访问操作,后跟一个调用表达式,我想将成员访问和调用表达式分成两个单独的表达式.
如果要将方法存储在变量中,而不是存储
var f = obj.mymethod;
f();
Run Code Online (Sandbox Code Playgroud)
你可以做
var f = obj.mymethod.bind(obj);
f();
Run Code Online (Sandbox Code Playgroud)