我遇到的东西说明了我显然还没有得到它。
任何人都可以解释为什么“this”的值在以下变化?
var MyFunc = function(){
alert(this);
var innerFunc = function(){
alert(this);
}
innerFunc();
};
new MyFunc();
答案 0 :(得分:18)
在JavaScript中,this
表示函数调用的上下文对象,而不是定义它的范围(或调用它的范围)。对于MyFunc
,它引用了正在创建的新对象;但是对于innerFunc
,它引用了全局对象,因为在调用innerFunc
时没有指定上下文。
这往往会使那些习惯于Java或类似OO语言的语言绊倒,其中this
几乎总是引用定义被调用方法的类的实例。请记住:JavaScript没有方法。或者课程。只是对象和功能。
答案 1 :(得分:2)
请执行以下操作:
var MyFunc = function(){
var self = this;
alert(self);
var innerFunc = function(){
alert(self);
}
innerFunc();
};
new MyFunc();
这样自我将永远意味着这一点,无论你从哪里调用它,通常都是你想要的。
答案 2 :(得分:1)
作为旁注,“this”不一定引用实际函数,因为你可以使用“强制”this-reference来调用函数,考虑一个事件处理程序,其中将引用触发事件的实际元素。
使用
yourFunction.apply(thisReference, arguments)
你可以调用它,“this”将指向你传递的第一个参数。
答案 3 :(得分:1)
有关闭包的详细说明,请访问:
http://www.brockman.se/writing/method-references.html.utf8
先生。布罗克曼清楚地说明了你遇到的问题。我不时地读这篇文章只是为了能够说:“啊哈!我明白了!”
有关更有趣的JavaScript课程,请访问Douglas Crockford的“Wrrrld Wide Web”
作为JSON的创造者,Crockford先生在JavaScript方面是“The Man”。他不了解我,但他已经指导了我对JavaScript的美丽的理解,不仅仅是编程。
你很接近成为比现在更好的程序员。我说这不是一种贬低的意思,而是知道这两位作者如何挑战我自己的技能。
答案 4 :(得分:-1)
乍一看我会说这是因为外部'this'是对MyFunc的引用而内部'this'是对innerFunc的引用。
然而,Javascript不是我有任何特殊专长。