'this'的4种不同场景。 什么是正确的解释?
这些都是从tuts-premium Jquery vid教程中获得的。
http://tutsplus.com/lesson/the-this-keyword/杰夫解释了每次“这”是指什么,但我不确定我是否掌握了所有背后的推理。
例如1
function doSomething(e) {
e.preventDefault();
console.log(this);
}
$('a').on('click', doSomething);
在这种情况下,“这指的是'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);
在这种情况下“这仍然指'a'元素”(*但显然它不是父对象?)
看来这次我们正在调用一个方法,但是这个陈述仍然与Eg 1相同
*教程中的一件事让我有点困惑。 我认为'this'总是指向父对象,所以在这种情况下'a'仍然是父对象。 但是(在本教程的05.23中),他推断事实并非如此,他说“有时候你想要'这个'来引用它的父对象,这个父对象将是'obj'”,在这个事件中他创建eg3。
例如3
var obj = {
doIt: function(){
console.log(this);
}
}
$('a').on('click', function(e){
obj.doIt();
};
e.preventDefault();
在这种情况下,“这指的是obj对象”
我认为这是因为'this'是嵌套函数,因为这个陈述等同于:
$('a').on('click', function(){
function(){ console.log(this);}
};
e.preventDefault();
我不明白为什么,特别是当我在一篇文章中看到嵌套函数“this”失去它的方式并引用头对象(窗口对象)时“。
EG4
var obj = {
doIt: function(){
console.log(this);
}
}
$('a').on('click', function(e){
obj.doIt.call(this);
e.preventDefault();
});
在这种情况下“这指的是'一''”
根据Javascript定义指南“第一个参数都是调用函数的对象”这里“这个”被用作第一个参数。 但是“this”不是函数被调用的对象??
我想我得到的调用函数在那里调用函数,并使用它的第一个参数作为指向不同对象的指针,但我不明白为什么使用'this'意味着该函数被'a'调用。 这不是我在其他调用()示例中看到的。
对不起,这么庞大的职位。 希望这个阶段有人还在读书......
我希望这有助于澄清问题,确实可能会造成混淆。
当this
是在你的代码松动,将引用全局对象(在Web浏览器,即window
)。
console.log(this); // window
当this
在一个对象方法内时(例如你的Eg 3),它会引用该对象。 这适用于使用new
或作为对象文字实例化的对象(如您的示例)。
var obj = {
doIt: function(e){
console.log(this);
}
}
obj.doIt(); // obj
在事件处理程序中, this
将引用事件绑定的对象。
// This is the plain js equivalent of your jQuery example
document.getElementsByTagName['a'][0].addEventListener('click', function(e){
console.log(this); // the first anchor on the document
});
// This is exactly the same:
var clickHandler = function(e){
console.log(this); // the first anchor on the document
};
document.getElementsByTagName['a'][0].addEventListener('click', clickHandler);
// Even if the handler is defined inside of another object, this will be
// the obj the event is bound to. It's the case of your E.g. 2
var obj = {
doIt: function(e){
console.log(this); // the first anchor on the document
}
}
document.getElementsByTagName['a'][0].addEventListener('click', obj.doIt);
// When you pass obj.doIt to addEventListener above, you are passing a reference
// to that function. It's like "stealing" the function from the object
当一个对象作为第一个参数传递给Function.call
或Function.apply
,如果this
出现在函数内部,它将引用你传递的对象。 这是一种迫使this
将指向的方式。
var obj = {
doIt: function(){
console.log(this); // window
}
}
obj.doIt.call(window);
https://developer.mozilla.org/en/JavaScript/Reference/Operators/这是对this
关键字的简短介绍。 并查看call()
的参考。
随着jQuery在dom元素的上下文中调用(是的,使用.call()
方法)事件处理程序,所有示例都将被解释。
该方式this
表现在JavaScript是有点混乱在第一。 基本上,与变量(它们是静态范围的)不同, this
是动态范围的。 也就是说,值this
是在那里你调用该函数,而不是在那里你写的决定。
当你将你的函数传递给它on
,它将在一个上下文中被调用,在this
上下文中this
是所讨论的元素。 无论您如何获得该功能,都会发生这种情况。 也就是说,一个函数并不关心你是否使用访问语法喜欢obj.fn
或只是它的名字fn
表达的--the值是在两种情况下是相同的。
除了函数之外,这是有道理的。 鉴于:
var a = 10,
obj = { a : 10 };
你会同意表达式a
和obj.a
具有相同的值。 功能也是如此。
简而言之, this
取决于你调用函数的地点和方式,而不是你声明它的方式和位置,或者你在调用它之前如何引用它。
上一篇: 4 different scenarios of 'this'. What's the correct interpretation?