Это взято из туториалов. - Премиум-учебники по Jquery.
http://tutsplus.com/lesson/the-this-keyword/
Джефф каждый раз объясняет, что имеет в виду «это», но я не уверен, что понял причину их всех.
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);
В данном случае "это по-прежнему относится к элементу 'a'" (*но, видимо, это не родительский объект?)
Кажется, на этот раз мы вызываем метод, но оператор по-прежнему приравнивается к тому же вещь как например 1
*Одна вещь в туториале меня немного смутила. Я думал, что «это» всегда относится к родительскому объекту, поэтому в этом случае «а» по-прежнему является родительским объектом. Но (в 05.23 в учебнике) он делает вывод, что это не так, заявляя, что «могут быть случаи, когда вы хотите, чтобы «это» ссылалось на его родительский объект, который был бы «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 «теряется и ссылается на головной объект (объект окна)».
E.g.4
var obj = {
doIt: function(){
console.log(this);
}
}
$('a').on('click', function(e){
obj.doIt.call(this);
e.preventDefault();
});
В этом случае «Это относится к 'a'»
Согласно Javascript Definitive Guide «Первый аргумент обоих call() — это объект, для которого должна быть вызвана функция»
Здесь «это» используется в качестве первого аргумента.Но «это» не является объектом, для которого должна быть вызвана функция??
Я думаю, что понимаю, что функция вызова предназначена для вызова функции и использования ее первого параметра в качестве указателя на другой объект, но я не понимаю, почему использование «этого» означает, что функция вызывается «а». Это не то, что я видел в других примерах call().
Извините за такой громадный пост. Надеюсь, кто-то еще читает на этом этапе…