strict mode - garevna/js-course GitHub Wiki

🎓 strict mode

"use strict"

Это директива для интерпретатора

Директива 'use strict' распознается только в начале скрипта или функции

function sample () {
    'use strict'
    ...
}

Директива 'use strict' переводит выполнение скрипта в строгий режим ( strict mode )

🚫 В строгом режиме нельзя:


⚠️ использовать необъявленные переменные

'use strict'
x = 8
будет сгенерировано исключение:
⛔️ Uncaught ReferenceError: x is not defined

⚠️ удалять переменные и функции оператором delete

обычный режим:
function sum ( x, y ) {
    return x + y
}
delete sum   // false
строгий режим:
'use strict'
function sum ( x, y ) {
    return x + y
}
delete sum
будет сгенерировано исключение:
⛔️ Uncaught SyntaxError: 
Delete of an unqualified identifier in strict mode.

⚠️ присваивать восьмеричные значения

обычный режим:
var x = 010   // 8
строгий режим:
'use strict'
var x = 010
будет сгенерировано исключение:
⛔️ Uncaught SyntaxError: 
Octal literals are not allowed in strict mode.

⚠️ использовать экранированные восьмеричные значения

обычный режим:
var x = "\010"   // ""
строгий режим:
'use strict'
var x = "\010"
будет сгенерировано исключение:
⛔️ Uncaught SyntaxError: 
Octal escape sequences are not allowed in strict mode.

⚠️ изменять значения неперезаписываемых свойств

обычный режим:
var sample = Object.defineProperty(
    {},
    "x",
    { value:0, writable:false }
)
sample.x = 5   // 0
строгий режим:
'use strict'
var sample = Object.defineProperty(
    {},
    "x",
    { value:0, writable:false }
)
sample.x = 5
будет сгенерировано исключение:
⛔️ Uncaught TypeError: 
Cannot assign to read only property 'x' of object '#<Object>'

⚠️ изменять значения свойств с геттером ( без сеттера )

обычный режим:
var obj = { 
    get x() {
        return 0
    } 
}
obj.x = 5 // 0
строгий режим:
'use strict'
var obj = { 
    get x() {
        return 0
    } 
}
obj.x = 5
будет сгенерировано исключение:
⛔️ Uncaught TypeError: 
Cannot set property x of #<Object> which has only a getter

⚠️ удалять неудаляемые свойства

обычный режим:
delete Object.prototype  // false
строгий режим:
'use strict'
delete Object.prototype
будет сгенерировано исключение:
⛔️ Uncaught TypeError: 
Cannot delete property 'prototype' of function Object() { [native code] }

⚠️ использовать eval как имя переменной

обычный режим:
var eval = 7  // 7
строгий режим:
'use strict'
var eval = 7
будет сгенерировано исключение:
⛔️ Uncaught SyntaxError: 
Unexpected eval or arguments in strict mode

⚠️ использовать arguments как имя переменной

обычный режим:
var arguments = 7  // 7
строгий режим:
'use strict'
var arguments = 7
будет сгенерировано исключение:
⛔️ Uncaught SyntaxError: 
Unexpected eval or arguments in strict mode

⚠️ использовать arguments.callee

обычный режим:
function test () {
    console.log ( arguments.callee )
}

test ()
Результат в консоли:
ƒ test () {
    console.log ( arguments.callee )
}
строгий режим:
'use strict'

function test () {
    console.log ( arguments.callee )
}

test ()
будет сгенерировано исключение:
⛔️ Uncaught TypeError:
'caller', 'callee', and 'arguments' properties 
may not be accessed on strict mode functions 
or the arguments objects for calls to them

⚠️ использовать свойство caller

обычный режим:
function test () {
    ( function () {
        console.log ( arguments.callee.caller )
    })()
}

test ()
Результат в консоли:
ƒ test () {
    ( function () {
        console.log ( arguments.callee.caller )
    })()
}
строгий режим:
'use strict'

function test () {
    ( function () {
        console.log ( arguments.callee.caller )
    })()
}

test ()
будет сгенерировано исключение:
⛔️ Uncaught TypeError:
'caller', 'callee', and 'arguments' properties 
may not be accessed on strict mode functions 
or the arguments objects for calls to them

⚠️ использовать выражение with

обычный режим:
var x, y
with ( String ) {
   x = fromCharCode ( 89, 75 )
}
console.log ( x )  // "YK"
with ( Math ) {
   y = round ( x = random () * 1000 )
}
console.log ( y )  // 256
строгий режим:
'use strict'
var x, y
with ( String ) {
   x = fromCharCode ( 89, 75 )
}
console.log ( x )  // "YK"
with ( Math ) {
   y = round ( x = random () * 1000 )
}
console.log ( y )  // 256
будет сгенерировано исключение:
⛔️ Uncaught SyntaxError: 
Strict mode code may not include a with statement

⚠️ метод eval () не может создавать переменные в области видимости, в которой он был вызван

по соображениям безопасности
обычный режим:
eval ( "var gamma = 2" )
console.log ( gamma )
строгий режим:
'use strict'
eval ( "var gamma = 2" )
console.log ( gamma )
будет сгенерировано исключение:
⛔️ Uncaught ReferenceError: 
gamma is not defined

⚠️ использовать как имена переменных ключевые слова:

🔴 implements
🔴 interface
🔴 let
🔴 package
🔴 private
🔴 protected
🔴 public
🔴 static
🔴 yield
будет сгенерировано исключение:
⛔️ Uncaught SyntaxError: 
Unexpected strict mode reserved word
⚠️ **GitHub.com Fallback** ⚠️