Строгий режим (strict mode)
1"use strict"
Это директива для интерпретатора, переводит выполнение скрипта в строгий режим ( strict mode
)
Директива 'use strict'
распознается только в начале скрипта или функции
1function sample () {2 'use strict'3 ...4}
:no_entry_sign: В строгом режиме нельзя:
- использовать необъявленные переменные
1'use strict'2x = 8 // ️ Uncaught ReferenceError: x is not defined
1// Обычный режим:2function sum ( x, y ) {3 return x + y4}5delete sum // false67'use strict'8function add ( x, y ) {9 return x + y10}11delete add // ⛔️ Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
- присваивать восьмеричные значения
обычный режим:
1// Обычный режим:2var x = 010 // 834'use strict'5var b= 010 // Uncaught SyntaxError: Octal literals are not allowed in strict mode.
- использовать экранированные восьмеричные значения
обычный режим:
1var x = "\010" // ""23'use strict'4var b = "\010" // Uncaught SyntaxError: Octal escape sequences are not allowed in strict mode.
- изменять значения неперезаписываемых свойств
1var sample = Object.defineProperty(2 {},3 "x",4 { value:0, writable:false }5)6sample.x = 5 // 078'use strict'9var sample = Object.defineProperty(10 {},11 "x",12 { value:0, writable:false }13)14sample.x = 5 // Uncaught TypeError: Cannot assign to read only property 'x' of object '#<Object>'
- изменять значения свойств с геттером ( без сеттера )
1var obj = {2 get x() {3 return 04 }5}6obj.x = 5 // 078'use strict'9var obj = {10 get x() {11 return 012 }13}14obj.x = 5 // Uncaught TypeError: Cannot set property x of #<Object> which has only a getter
- удалять не удаляемые свойства
1delete Object.prototype // false23'use strict'4delete Object.prototype // Uncaught TypeError: Cannot delete property 'prototype' of function Object() { [native code] }
- использовать eval как имя переменной
1var eval = 7 // 723'use strict'4var eval = 7 // Uncaught SyntaxError: Unexpected eval or arguments in strict mode
- использовать arguments как имя переменной
1var arguments = 7 // 723'use strict'4var arguments = 7 // Uncaught SyntaxError: Unexpected eval or arguments in strict mode
- использовать arguments.callee
1function test () {2 console.log ( arguments.callee )3}45test ()
Результат в консоли:
1ƒ test () {2 console.log ( arguments.callee )3}
1'use strict'23function test () {4 console.log ( arguments.callee )5}67test ()
Результат в консоли:
1Uncaught TypeError:2'caller', 'callee', and 'arguments' properties3may not be accessed on strict mode functions4or the arguments objects for calls to them
- использовать свойство caller
1function test () {2 ( function () {3 console.log ( arguments.callee.caller )4 })()5}67test ()
Результат в консоли:
1ƒ test () {2 ( function () {3 console.log ( arguments.callee.caller )4 })()5}
1'use strict'23function test () {4 ( function () {5 console.log ( arguments.callee.caller )6 })()7}89test ()
Результат в консоли:
1Uncaught TypeError:2'caller', 'callee', and 'arguments' properties3may not be accessed on strict mode functions4or the arguments objects for calls to them
- использовать выражение with
1var x, y2with ( String ) {3 x = fromCharCode ( 89, 75 )4}5console.log ( x ) // "YK"6with ( Math ) {7 y = round ( x = random () * 1000 )8}9console.log ( y ) // 256
1'use strict'2var x, y3with ( String ) {4 x = fromCharCode ( 89, 75 )5}6console.log ( x ) // "YK"7with ( Math ) {8 y = round ( x = random () * 1000 )9}10console.log ( y ) // 256
1Uncaught SyntaxError:2Strict mode code may not include a with statement
- метод eval () не может создавать переменные в области видимости, в которой он был вызван по соображениям безопасности
1eval ( "var gamma = 2" )2console.log ( gamma )345'use strict'6eval ( "var alpha = 2" )7console.log ( alpha ) // Uncaught ReferenceError: alpha is not defined
использовать как имена переменных ключевые слова:
- 🔴 implements
- 🔴 interface
- 🔴 let
- 🔴 package
- 🔴 private
- 🔴 protected
- 🔴 public
- 🔴 static
- 🔴 yield
будет сгенерировано исключение:
1Uncaught SyntaxError:2Unexpected strict mode reserved word