2015-10-28 5 views
0

Взгляните на этот пример:Почему `this` установлен в` window`, если я использую `function.apply (undefined, args)`?

function aaa() { 
    console.dir(this) 
} 

function bbb() {} 

aaa.apply(undefined, [1,2,3]) // this in aaa is `window` object 
aaa.apply(bbb, [1,2,3]) // this in aaa is `bbb` function 

Почему this набор для window в первом случае применяется, несмотря на то, что я пытаюсь заставить его быть undefined?

+0

Поскольку ваша функция находится в неаккуратном режиме. – Bergi

+0

@ Bergi сказать что? – bodacydo

+0

Non- "строгий режим". Добавьте '' use strict '; 'перед' console.dir', и он отобразит 'undefined'. – Bergi

ответ

5

Когда не в строгом режиме и либо null или undefined передается в качестве первого аргумента .apply(), this будет установлен на глобальный объект, который находится в браузере window.

В строгом режиме он установит this на фактическое значение, которое вы передадите.

В целом нестрогий режим пытался быть толерантным к ошибкам и даже «исправлять» некоторые ошибки автоматически для вас. Иногда это оказалось проблемой, потому что система, которая должна была быть мгновенной ошибкой кодирования, была «закрыта» системой. строгий режим был изобретен по ряду причин, и одной из причин было прекратить скрывать ошибки кодирования.

+0

Является ли 'undefined' таким же, как нет значения? Я передаю его неопределенным как ценность? или 'undefined' не значение? – bodacydo

+0

Мне нужно посмотреть, что такое строгий режим. – bodacydo

+1

@bodacydo - При некотором кратком тестировании в Chrome в нестрогом режиме «нет значения» в этом случае является «null» или «undefined». Эти значения преобразуются в 'window'. Другие используются. – jfriend00

1

Так как функции работают, если вы не в strict mode. Без строгого режима ссылка this функции всегда относится к объекту, и это будет глобальный объект (т. Е. window), если никакой другой объект не был указан.

+0

Спасибо. Теперь я знаю. – bodacydo