Страницы

Поиск по вопросам

воскресенье, 24 ноября 2019 г.

Что значит “use strict”?


Нередко встречается код со строкой "use strict";. Например, библиотеки часто начинаются с этого:

(function () {
    "use strict";


Что значит "use strict", и зачем его использовать?



На других языках: English • Español
    


Ответы

Ответ 1



"use strict"; (перевод: «использовать строгий») - это установка, которая заставляе код обрабатываться в строгом режиме. Без этой установки код обрабатывается в неограниченно режиме. Строгий режим был введён в ECMAScript 5, и старые браузеры (IE9 и младше) его н поддерживают. То есть, не обращают внимания на установку по умолчанию и всё обрабатываетс в неограниченном режиме. Зачем использовать "use strict";? В строгом режиме: некоторые ошибки можно найти быстрее, более опасные и не полезные черты JavaScript либо запрещены, либо приводят к ошибке. Как использовать "use strict";? Чтобы включить строгий режим в целом скрипте, надо поставить установку "use strict" или 'use strict'; в начало скрипта. "use strict"; // код здесь обрабатывается в строгом режиме Чтобы включить строгий режим в функции, надо поставить установку в начало кода функции. // код здесь обрабатывается в неограниченном режиме function f() { "use strict"; // код здесь обрабатывается в строгом режиме } // код здесь обрабатывается в неограниченном режиме В чём различие между строгим режимом и неограниченным режимом? В строгом режиме: нельзя присваивать значение в неопределённую переменную (спецификация §11.13.1) В неограниченном режиме создается глобальная переменная. (function() { "use strict"; x = 5; // ReferenceError: x is not defined })(); x = 5; // Создает глобальную переменную x Также нельзя присваивать значение в свойство данных только для чтения. (function() { "use strict"; window.undefined = 5; // TypeError: Cannot assign to read only })(); // property 'undefined' of [object Object] window.undefined = 5; // Ничего не делает нельзя использовать инструкцию with (спецификация §12.10). (function() { "use strict"; with(Object) {} // SyntaxError: Strict mode code may not include a with statement })(); в ES5 нельзя определить повторные свойства в литерале объекта (спецификация §11.1.5). (function() { "use strict"; var x = { a: 1, a: 2 }; // SyntaxError: Duplicate data property in object literal })(); // not allowed in strict mode var x = { a: 1, a: 2 }; // x равно {a: 2} нельзя определить повторные формальные параметры функции (спецификация §13.1, §15.3.2). function f(a, a) { "use strict"; } // SyntaxError: Strict mode function may not have duplicate parameter names function f(a, a) { return a; } f(1,2); // возвращает 2 изменения объекта arguments не изменяют аргументы (спецификация §10.6). function f(x) { "use strict"; arguments[0] = 5; return x; } f(10); // возвращает 10 function f(x) { arguments[0] = 5; return x; } f(10); // возвращает 5 delete приводит к ошибке, если аргумент - не изменяемое свойство объекта (спецификаци §11.4.1). (function f(x) { "use strict"; var y = 4; delete f; // SyntaxError: Delete of an unqualified identifier in strict mode. delete x; // SyntaxError: Delete of an unqualified identifier in strict mode. delete y; // SyntaxError: Delete of an unqualified identifier in strict mode. delete window.undefined; // TypeError: Cannot delete property })(); // 'undefined' of [object Object] (function f(x) { var y = 4; delete f; // Возвращает false delete x; // Возвращает false delete y; // Возвращает false delete window.undefined; // Возвращает false })(); eval не может инстанциировать переменные и функции в контексте вызова (спецификаци §10.4.2). (function () { "use strict"; eval("var x = 5"); return x; // ReferenceError: x is not defined })(); (function () { eval("var x = 5"); return x; })(); // Возвращает 5 this не преобразуется в объект, а если значение this - undefined или null, то н преобразуется в глобальный объект (спецификация §10.4.3). function f() { "use strict"; return this; }; f.call(4); // возвращает 4 f.call(null); // возвращает null f.call(undefined); // возвращает undefined function f() { return this; }; f.call(4); // возвращает [object Number] f.call(null); // возвращает [object global] f.call(undefined); // возвращает [object global] eval и arguments - нельзя изменить или использовать в качестве имени (спецификаци §11.4.4, §11.4.5, §11.13, §12.2.1, §12.10, §12.14.1, §13.1). function eval(arguments) { // SyntaxError: Unexpected eval or arguments in stric mode "use strict"; eval = "5"; // SyntaxError: Unexpected eval or arguments in stric mode ++eval; // SyntaxError: Unexpected eval or arguments in stric mode arguments++; // SyntaxError: Unexpected eval or arguments in stric mode try { var arguments = 5; // SyntaxError: Unexpected eval or arguments in stric mode } catch(eval) {} // SyntaxError: Unexpected eval or arguments in stric mode return arguments.eval; } function eval(arguments) { eval = "5"; ++eval; arguments++; try { var arguments = 5; } catch(eval) {} return arguments.eval; } eval(); // возвращает 5 нельзя использовать argument.caller и arguments.callee (спецификация §13.2). (function f() { "use strict"; arguments.caller; // TypeError: 'caller', 'callee', and 'arguments' propertie may not be accessed on strict mode functions or the arguments objects for calls to them arguments.callee; // TypeError: 'caller', 'callee', and 'arguments' propertie may not be accessed on strict mode functions or the arguments objects for calls to them f.arguments; // TypeError: 'caller', 'callee', and 'arguments' propertie may not be accessed on strict mode functions or the arguments objects for calls to them })(); больше слов, зарезервированных для использования в будущем (спецификация §7.6.1.2). (function () { "use strict"; var implements, let, private, public, yield, interface, package, protected, static; })(); // SyntaxError: Unexpected strict mode reserved word нельзя использовать литералы восьмеричной СС (спецификация B.1.1, B.1.2). (function () { "use strict"; return 010 + // SyntaxError: Octal literals are not allowed in strict mode. "\077"; // SyntaxError: Octal literals are not allowed in strict mode. })(); (function () { return 010 + "\077"; })(); // возвращает "8?"

Ответ 2



Если в двух словах то 'use strict' этим ты указываешь что используешь ES6 (ECMAScript6) самый последний стандарт JavaScript, который отличается синтаксисом от предыдущего (ES5).

Комментариев нет:

Отправить комментарий