我把一些 DOM 方法赋给变量,以供方便使用,但是遇到了错误。
var gTag = document.getElementsByTagName;
// undefined
gTag
// getElementsByTagName ()
gTag ("p")
// TypeError: 'getElementsByTagName' called on an object that does not implement interface Document.
刚接触 JS 没多久,非常不理解,为什么把这个方法赋给变量,不用括号输入变量名就是直接调用了。
然后我了解了下 call 和 apply 方法,原来 JS 下有这种好用的机制,一个新对象未定义一个方法,可直接调用旧对象的方法,只需要把新对象作为 this 传给旧对象的方法。
function Old (){}
Old.prototype = {
name: "old name",
run: function (){
console.log ("Name is: " + this.name );
}
}
var o = new Old;
var New = {
name: "new name"
};
o.run (New ); // Name is new name
var run = o.run;
run.call (o ); // name is old name
但是我非常不理解为什么把实例的方法赋值给一个变量后会丢失 this 指针。
这里无意挑起语言的纷争!!
然后我想起了 Python 的类:
class A:
def run (self ):
return "running"
a = A ()
run = a.run
run ()
A.run ()
"""Traceback (most recent call last ):
File "<stdin>", line 1, in <module>
TypeError: unbound method run () must be called with A instance as first argument (got nothing instead )"""
A.run (a )
好像明白了些什么,但是又好像模糊!
JS 里面把实例方法赋值给变量,以变量再调用,但是 this 会丢失。就好像如 Python 中的 A.run
未实例化直接使用,也会报错。 JS 在 nodejs 环境下虽然未报错,但是输出的是 Name is undefined 也就是说找不到 this.name ,当成一个普通函数运行了。
我的理解是否有误?
现在还是不太明白为什么对实例方法赋值操作 var a = object.method
会丢失 this 。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.