2014-12-31 4 views
1

Пила этот пример как умственное упражнение. Я не понимаю, почему он возвращает true. Разумеется, внутренний this должен быть ограничен анонимной функцией, а внешний this не связан с этой функцией вообще.Почему этот фрагмент JavaScript возвращает true?

var result = (function() { 
 
    return this; 
 
}()) === this; 
 

 
var el = document.createElement("div") 
 
el.innerHTML = result; 
 
document.body.appendChild(el)

+0

'console.log (this);' – epascarello

+1

'this' не относится к области видимости, это зависит от того, как вы вызываете функцию. – elclanrs

+0

«это» ваша функция относится к окну. – Entrabiter

ответ

3

Там не так много, обзорное здесь, только "контекст".

В качестве IIFE вызывается без контекста, то внутренние this по умолчанию в window (за исключением ES5 «строгого режима»), который также является значением по умолчанию this в глобальном масштабе.

+0

О, дорогой. Почему не «использовать строгую», вызывая ошибку, вместо того, чтобы изменять значение результата? –

+0

, потому что это возможно (через 'call' или' apply'), чтобы предоставить контекст этой функции. Неправильно «это» (по моему опыту) всегда ошибка программиста, а не ошибка времени выполнения. – Alnitak

0

Этот вопрос касается не области обзора, а контекста.

Контекст (т. Е. Это) в JS обычно устанавливается как объект, против которого вызывается функция.

В этом случае ни один пользовательский объект не вызывает IIFE, поэтому контекст внутри него по умолчанию относится к глобальному объекту, следовательно, true.

Указание строгого режима приведет к неопределению контекста внутри IIFE, что уменьшит вероятность случайных глобальных изменений объектов.