我正在为一个项目进行代码转换,并遇到了不寻常的边界情况。为什么不能将函数的调用成员分配给变量
我有以下几点:
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()是一个成员访问操作,后跟一个调用表达式,我想将成员访问和调用表达式分离为两个单独的表达式。
*任何*方法依靠'this'价值,包括本地' Function.prototype.call'方法,有这个问题。解决方案是将其绑定到对象,或不使用这种低劣的转码。 – Bergi
为什么转码需要你改变功能? – MayorMonty
有没有办法做到这一点,仍然分裂一个表达式,它的组成部分?例如'tmp(func)'而不是'tmp()' –