JavaScript "использовать строгое"; внутри функции
Протестировал некоторый js-код в Chrome Dev Console, и я немного запутался.
Я знаю, что в строгом режиме функции, которые не являются методами объекта при обращении к этому ключевому слову, должны получать неопределенный вместо глобального объекта.
function test(){
"use strict";
return this===undefined;}
test();
Выходы ложные.
"use strict";
function test(){
return this===undefined;}
test();
Все еще ложь.
(function test(){
"use strict";
return this===undefined;}());
Выходы верны.
Просто хотел уточнить. ʔ •ᴥ•ʔ Я новичок в JS.
3 ответа
Это ошибка в консоли разработчика Chromium, которая вызывает this
по-прежнему ссылаться на глобальный объект. Тот же код работает как указано с javascript:
в адресной строке и в документах.
Вы можете проверить это следующим образом (2 входа консоли):
var global = (function () { return this; }());
"use strict";
function test () { return this === global; }
test();
и (один или несколько консольных входов)
var script = document.createElement("script");
script.type = "text/javascript";
script.appendChild(document.createTextNode(
'function test () { "use strict"; return this === undefined; }; console.log(test());'
));
document.body.appendChild(script);
Протестировано в Chromium версии 25.0.1364.97 Debian 7.0 (183676).
То, что вы заметили, является просто побочным эффектом работы консоли разработчика. Когда вы вводите код там, это действительно то, что происходит (см. Этот ответ для более подробной информации):
eval.call(null, "with (window) { \
function test() { \
'use strict'; \
console.log(this); \
} test(); \
}");
Это косвенный призыв к eval
Это означает, что он всегда будет выполняться в глобальном контексте выполнения (в браузере это window
).
По сути, функция связана с глобальным объектом и, следовательно, this
содержит ссылку на глобальный объект, как если бы вы делали это на веб-странице (а не в консоли):
function test(){
"use strict";
return this === undefined;
}
test(); // true
test.call(window); // false
Все в порядке. Если вы запускаете свой код через некоторую HTML-страницу (не через консоль разработчика), результаты соответствуют ожиданиям (всегда this===undefined
).
Дополнительно в последней версии Firefox (Firebug):
function test(){
"use strict";
return this===undefined;}
test();
>> true
Так что, похоже, это просто еще одна ошибка Chrome (функция?). Такое ощущение, что он немного отличается от кода, который передается через консоль разработчика.
Также обратите внимание, что порядок имеет значение:
<script>
console.log( 'Me First!' );
"use strict";
function test(){
console.log( this );
}
test();
</script>
>>> "Me First!"
>>> Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}
Но:
<script>
"use strict";
console.log( 'Me later!' );
function test(){
console.log( this );
}
test();
</script>
>>> undefined
>>> "Me later!"