Нередко встречается код со строкой "use strict" . Например, библиотеки часто начинаются с этого: (function () { "use strict" Что значит "use strict", и зачем его использовать?
На других языках: English • Español
Ответ "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 strict mode "use strict" eval = "5" // SyntaxError: Unexpected eval or arguments in strict mode ++eval // SyntaxError: Unexpected eval or arguments in strict mode arguments++ // SyntaxError: Unexpected eval or arguments in strict mode try { var arguments = 5 // SyntaxError: Unexpected eval or arguments in strict mode } catch(eval) {} // SyntaxError: Unexpected eval or arguments in strict 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' properties may not be accessed on strict mode functions or the arguments objects for calls to them arguments.callee // TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them f.arguments // TypeError: 'caller', 'callee', and 'arguments' properties 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?"