Обхват на конзолата на Firebug. Защо "това" не е винаги едно и също? Не трябва ли да е "прозорец" през цялото време?
Обхват на прозореца на конзолата на Firebug. Защо това не е винаги едно и също?
Отговори (3)
Стойността на this
в конзолата ще бъде същата като стойността на this
в кода, който се изпълнява в момента. Обмисли:-
function outer()
{
// this is window
var x = {n:12};
var fn = function()
{
// this is object {n:12}
alert(this.n);
}
fn.call(x);
}
...
<img src="thing.gif" onclick="outer()" />
Ако поставите точка на прекъсване на реда x = {n:12}
, превключете към конзолата, ще откриете, че this
е прозорецът. Въпреки това, когато преминете към реда alert
, this
в конзолата е обектът, който се държи от променливата x
. IOW няма разлика между this
в контекста на изпълнение и конзолата. Поради тази причина можете да използвате конзолата, за да променяте стойностите на променливите и свойствата, докато отстранявате грешки.
Във функция, извикана директно без изричен обект собственик, кара стойността на this да бъде обектът по подразбиране (прозорец в браузъра).
Във функция, извикана чрез синтаксиса за извикване на метод, като
objname.myFunction()
илиobjname['myFunction']()
, кара стойността на this да бъде objname.
Вижте повече за функциите за извикване на работа в JavaScript
JavaScript, 5 начина за извикване на функция
Ключовата дума this
винаги се отнася до собственика на извикваната функция. Можете да прочетете ясно и подробно обяснение за него тук.
От статията, която свързах над това изображение, мисля, че го обяснява най-ясно: