本文共 948 字,大约阅读时间需要 3 分钟。
>> var a = function(){return 1}undefined>> var b = aundefined>> b()1>> var c = document.getElementByIdundefined>> c('a')TypeError: Illegal invocation
在上面这段代码中,变量b成功地引用了函数a,但是变量c却不能成功应用内置函数document.getElementById,我感到很疑惑
>> var c = documentundefined>> c.getElementById('a')null我猜测是JavaScript禁止重命名内置函数,但是为什么重命名内置对象(上段代码)是可以的呢?
后来上网找资料发现原来是命名空间的问题,getElementById是document对象的方法,而c则是window的成员,按下面的写法可以获得正确的结果
>> document.d = document.getElementById>> document.d('wrap')...
附:在Python中不存在这样的问题
>>> class a: def b(self): print 'a.b' >>> c=a().b>>> c()a.b>>>
2016.10.21 更新
这个问题实际上是JavaScript的this动态绑定的问题,document是一个对象,在调用getElementById的时候是动态制定this,而使用c = document.getElementById的时候,c是一个指向这个方法的引用,但是调用的时候并没有给他动态绑定上它的this对象document,所以导致调用出错。Python由于对象的方法并不是完全等于定义的function,而是相当于把它自己的self对象放在了函数闭包里面,所以调用的时候不会出现问题。
var c = document.getElementById;c("a")// 等价于document.getElementById.call("a")// 正确的调用方法是document.getElementById.call(document, "a");
转载地址:http://mvuws.baihongyu.com/