【发布时间】:2012-04-24 08:18:18
【问题描述】:
这些来自 tuts-premium Jquery vid tutorials。
http://tutsplus.com/lesson/the-this-keyword/
Jeff 每次都会解释“this”指的是什么,但我不确定我是否掌握了所有这些背后的原因。
例如1
function doSomething(e) {
e.preventDefault();
console.log(this);
}
$('a').on('click', doSomething);
在这种情况下,“this 指的是 'a' 元素”(在这种情况下是父对象)
我猜那是因为这里的语句等同于:
$('a').on('click', function (e) {
e.preventDefault();
console.log(this);
}
所以'a'是父对象
例如2
var obj = {
doIt: function(e){
e.preventDefault();
console.log(this);
}
}
$('a').on('click', obj.doIt);
在这种情况下,“this 仍然指的是 'a' 元素”(*但显然它不是父对象?)
似乎这次我们调用了一个方法,但该语句仍然等同于 E.g. 1
*教程中的一件事让我有点困惑。我认为'this'总是指父对象,所以在这种情况下'a'仍然是父对象。但是(在本教程中的 05.23 处)他推断情况并非如此,并指出“有时您可能希望 'this' 引用它的父对象,这将是 'obj'”,在这种情况下,他创建了例如 3.
例如3
var obj = {
doIt: function(){
console.log(this);
}
}
$('a').on('click', function(e){
obj.doIt();
};
e.preventDefault();
在这种情况下,“this 指的是 obj 对象”
我认为这是因为“this”在嵌套函数中,因为该语句等同于:
$('a').on('click', function(){
function(){ console.log(this);}
};
e.preventDefault();
我真的不明白为什么,特别是当我在一篇文章中读到嵌套函数“this”“迷失方向并引用头对象(窗口对象)”时。
例如4
var obj = {
doIt: function(){
console.log(this);
}
}
$('a').on('click', function(e){
obj.doIt.call(this);
e.preventDefault();
});
在这种情况下“这指的是'a'”
根据 Javascript Definitive Guide “call() 的第一个参数是调用函数的对象”
这里“this”用作第一个参数。但是“this”不是要在其上调用函数的对象??
我想我知道调用函数是用来调用函数并将其第一个参数用作指向不同对象的指针,但我不明白为什么使用“this”意味着函数被“a”调用。这也不是我在其他 call() 示例中看到的。
很抱歉发布了如此庞大的帖子。希望这个阶段有人还在阅读……
【问题讨论】:
-
+1 因为我现在开始回答这个出色的问题为时已晚。毫无疑问,其他人很快就会 - 这是一个关键点,而且在 JS 教程中通常很少涉及。
-
“我认为 'this' 总是指父对象...” 不,不要将
this视为父对象。把它想象成一个调用上下文,它的值可以用几种不同的方式设置,其中一种恰好是从一个对象调用一个方法。