我是一个项目中的转码器,遇到了一个不寻常的极端情况。
我有下面这个:
function a(func){
return func.call()
}
由于多种原因,转码器希望将其更改为:
function a(func){
var tmp = func.call;
var res = tmp()
return res;
}
然而,调用
tmp()
时返回tmp不是函数
。如果我在这一行调试并暂停,tmp
被定义为一个函数。这与它的签名为
function call(){ [native code]}
有关吗?还有其他会触发类似错误的函数吗?
除了简单地不这样做之外,是否有其他方法可以解决这个问题?
编辑: 我发现另一个情况,看起来可能与对象的上下文有关:
a = { toString: null }.propertyIsEnumerable
a("toString")
抛出相同的错误。
编辑:一些背景信息; 我正在编写转码器,它有一个非常特定的用例,即将代码的每一行分解为其最简单的组件部分。也许我无法进一步分离它。使用上面的示例,func.call()是成员访问操作,后跟调用表达式,我想将成员访问和调用表达式分开成两个单独的表达式。
this
值的方法,包括原生的Function.prototype.call
方法,都存在这个问题。解决方法是将其绑定到对象上,或者不使用这种糟糕的转码。 - Bergitmp(func)
而不是tmp()
。 - Zack Newshamfunc.call()
是一个成员访问操作,后面跟着一个调用表达式,我想将成员访问和调用表达式分开成两个独立的表达式。 - Zack Newsham