Я читал некоторые documentation about javascript и наткнулся на следующем примере:Почему вложенная локальная функция связывает `this` к окну вместо родителя
var o = {
value: 1,
outer: function() {
var inner = function() {
console.log(this); //bound to global object
};
inner();
}
};
o.outer();
Он выводит window
.
Я не могу понять, почему является this
ключевое слово связано с глобальным объектом (window
) вместо родительского объекта (outer
).
Если вы хотите получить доступ к outer
из inner
«сферы s, вы должны пройти outer
» s this
(который так же, как проходит outer
сам) в своей локальной inner
функции в качестве аргумента. Таким образом, как ожидалось:
var o = {
value: 1,
outer: function() {
var inner = function (that) {
console.log(that); //bound to global object
};
inner(this);
}
};
o.outer();
выходы outer
.
Разве это немного нонсенс, что в outer
«s объем this
связан с самим объектом (т.е. outer
), в то время как в inner
» s сферы, которая является локальной для outer
, this
является повторно оценка к глобальному объекту (т.е. он переопределяет привязку outer
)?
В ECMAScript specs говорится, что при входе в контекст выполнения кода функции, если «вызывающий при условии thisArg» либо нуля или неопределенных, то this
связан с глобальным объектом.
Но следующее:
var o = {
outer: function() {
var inner = function() {
console.log('caller is ' + arguments.callee.caller);
};
inner();
}
}
выводит объект outer
сам:
caller is function() {
var inner = function() {
console.log('caller is ' + arguments.callee.caller);
};
inner();
}
На стороне, но, вероятно, уместно, примечание:
В строгий режим первый вывод фрагмента кода undefined
вместо окна.
Это потому, что, как вы вызываете 'внутренний '-' inner(); '. Значение 'this' устанавливается так, как вы вызываете функцию. Любое anyways, 'inner' не имеет никакого отношения к' external', это всего лишь локальная переменная. Если вы использовали 'console.log (this);' внутри 'outer' и называли его следующим:' var a = o.outer; a(); ', вы получите' окно'. Вы можете подумать, что это вздор, но он разработан именно так - вам нужно научиться правильно его использовать. – Ian
«Спецификации ECMAScript заявляют, что при вводе контекста выполнения для кода функции, если« вызывающий объект, предоставленный thisArg », является либо нулевым, либо неопределенным, то он привязан к глобальному объекту». - Ты не ответил на свой вопрос? 'inner()' не указывает thisArg. –
@ Значит, область, в которой вызов сделан, вообще не имеет значения? –