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