2013-05-07 3 views
0

В приведенном ниже фрагменте кода, почему window.foo существует, но this.bar не определен?Контекст и функции объекта JavaScript

function foo() { 
    function bar() { }; 
    console.log(this.bar); 
} 

console.log(window.foo); 
foo.call({}); 
+1

Потому что 'this' в JavaScript' не имеет ничего общего с областью переменных. Это динамическое значение, которое устанавливается на основе того, как вызывается функция. Исключением является глобальная среда, в которой 'this' ссылается на глобальный объект' window', который также содержит глобальные переменные. – 2013-05-07 18:12:22

+0

'this' ищет метод' bar' или объект объекта 'global', который будет' window'. 'bar' не определен в объекте' global'. – Sethen

+0

Что меня больше всего смущает, так это то, что window.foo существует. Почему это происходит в глобальном масштабе, но не в каждом охвате ребенка? –

ответ

-1

В браузере окно является глобальным объектом, поэтому оно доступно везде, если оно не затенено. this указывает только на то, что полезно в теле функции, называемой методом; в foo.bar() - где в bar, this - foo, или когда bar.call (...) или bar.apply (...) вызывается с аргументом для this или когда вы находитесь вне функции вообще говоря, где он указывает на глобальный объект (окно).

Вы явно выполняете foo.call ({}), который устанавливает это в пустой объект. Таким образом, this.bar не существует во время этого вызова.