HTML / CSSJavaScriptNode jsПаттерны проектированияПрактические

Строгий режим (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 + y
4}
5delete sum // false
6
7'use strict'
8function add ( x, y ) {
9 return x + y
10}
11delete add // ⛔️ Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
  • присваивать восьмеричные значения
обычный режим:
1// Обычный режим:
2var x = 010 // 8
3
4'use strict'
5var b= 010 // Uncaught SyntaxError: Octal literals are not allowed in strict mode.
  • использовать экранированные восьмеричные значения
обычный режим:
1var x = "\010" // ""
2
3'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 // 0
7
8'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 0
4 }
5}
6obj.x = 5 // 0
7
8'use strict'
9var obj = {
10 get x() {
11 return 0
12 }
13}
14obj.x = 5 // Uncaught TypeError: Cannot set property x of #<Object> which has only a getter
  • удалять не удаляемые свойства
1delete Object.prototype // false
2
3'use strict'
4delete Object.prototype // Uncaught TypeError: Cannot delete property 'prototype' of function Object() { [native code] }
  • использовать eval как имя переменной
1var eval = 7 // 7
2
3'use strict'
4var eval = 7 // Uncaught SyntaxError: Unexpected eval or arguments in strict mode
  • использовать arguments как имя переменной
1var arguments = 7 // 7
2
3'use strict'
4var arguments = 7 // Uncaught SyntaxError: Unexpected eval or arguments in strict mode
  • использовать arguments.callee
1function test () {
2 console.log ( arguments.callee )
3}
4
5test ()

Результат в консоли:

1ƒ test () {
2 console.log ( arguments.callee )
3}
1'use strict'
2
3function test () {
4 console.log ( arguments.callee )
5}
6
7test ()

Результат в консоли:

1Uncaught TypeError:
2'caller', 'callee', and 'arguments' properties
3may not be accessed on strict mode functions
4or the arguments objects for calls to them

  • использовать свойство caller
1function test () {
2 ( function () {
3 console.log ( arguments.callee.caller )
4 })()
5}
6
7test ()

Результат в консоли:

1ƒ test () {
2 ( function () {
3 console.log ( arguments.callee.caller )
4 })()
5}
1'use strict'
2
3function test () {
4 ( function () {
5 console.log ( arguments.callee.caller )
6 })()
7}
8
9test ()

Результат в консоли:

1Uncaught TypeError:
2'caller', 'callee', and 'arguments' properties
3may not be accessed on strict mode functions
4or the arguments objects for calls to them

  • использовать выражение with
1var x, y
2with ( 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, y
3with ( 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 )
3
4
5'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
Hello