Sök…


Syntax

  • "använda strikt";
  • "använda strikt";
  • "använd strikt";

Anmärkningar

Strikt läge är ett alternativ som läggs till i ECMAScript 5 för att möjliggöra några bakåtkompatibla förbättringar. Uppförandeförändringar i "strikt läge" -kod inkluderar:

  • Tilldelning till odefinierade variabler väcker ett fel istället för att definiera nya globala variabler;
  • Tilldelning till eller radering av ej skrivbara egenskaper (t.ex. window.undefined ) ger ett fel i stället för att tyst köras;
  • Legat octal syntax (ex. 0777 ) stöds inte;
  • Den with uttalandet stöds inte;
  • eval kan inte skapa variabler i det omgivande omfånget;
  • Funktioner .caller Och .arguments stöds inte;
  • En funktions parameterlista kan inte ha dubbletter;
  • window används inte längre automatiskt som värdet på this .

OBS : - " strikt " -läge är INTE aktiverat som standard som om en sida använder JavaScript som beror på funktioner i icke-strikt läge, då kommer den koden att brytas. Således måste den aktiveras av programmeraren själv.

För hela skript

Strikt läge kan tillämpas på hela skript genom att placera uttalandet "use strict"; före andra uttalanden.

"use strict";
// strict mode now applies for the rest of the script

Strikt läge är endast aktiverat i skript där du definierar "use strict" . Du kan kombinera skript med och utan strikt läge, eftersom det strikta tillståndet inte delas mellan olika skript.

6

Obs: All kod skriven inuti ES2015 + moduler och klasser är strikt standard.

För funktioner

Strikt läge kan också tillämpas på enstaka funktioner genom att förbereda "use strict"; uttalande i början av funktionsdeklarationen.

function strict() {
   "use strict";
   // strict mode now applies to the rest of this function
   var innerFunction = function () {
     // strict mode also applies here
   };
}

function notStrict() {
  // but not here
}

Strikt läge kommer också att gälla för alla inre scopedfunktioner.

Ändringar av globala egenskaper

I ett icke-strikt lägeomfång, när en variabel tilldelas utan att initialiseras med var , const eller let nyckelordet, deklareras den automatiskt i det globala omfånget:

a = 12;
console.log(a); // 12

I strikt läge kommer emellertid all åtkomst till en odeklarerad variabel att kasta ett referensfel:

"use strict";
a = 12; // ReferenceError: a is not defined
console.log(a);

Detta är användbart eftersom JavaScript har ett antal möjliga händelser som ibland är oväntade. I icke-strikt läge leder dessa händelser ofta till utvecklare att tro att de är buggar eller oväntat beteende, och genom att möjliggöra strikt läge tvingas alla fel som kastas veta exakt vad som görs.


"use strict";
                       // Assuming a global variable mistypedVariable exists
mistypedVaraible = 17; // this line throws a ReferenceError due to the 
                       // misspelling of variable

Den här koden i strikt läge visar ett möjligt scenario: den kastar ett referensfel som pekar på uppdragets radnummer, vilket gör att utvecklaren omedelbart kan upptäcka misstypen i variabelns namn.

I icke-strikt läge, förutom det faktum att inget fel kastas och tilldelningen genomförs framgångsrikt, kommer den mistypedVaraible automatiskt att förklaras i den globala räckvidden som en global variabel. Detta innebär att utvecklaren måste leta upp manuellt denna specifika uppgift i koden.


Genom att tvinga deklaration av variabler kan utvecklaren dessutom inte av misstag deklarera globala variabler i funktioner. I icke-strikt läge:

function foo() { 
   a = "bar"; // variable is automatically declared in the global scope
}
foo();
console.log(a); // >> bar

I strikt läge är det nödvändigt att uttryckligen deklarera variabeln:

function strict_scope() { 
   "use strict";
   var a = "bar"; // variable is local
}
strict_scope();
console.log(a); // >> "ReferenceError: a is not defined"

Variabeln kan också deklareras utanför och efter en funktion, vilket gör att den kan användas till exempel i det globala omfånget:

function strict_scope() { 
   "use strict";
   a = "bar"; // variable is global
}
var a;
strict_scope();
console.log(a); // >> bar

Ändringar av egenskaper

Strikt läge förhindrar också att du kan ta bort ej återställbara egenskaper.

"use strict";
delete Object.prototype; // throws a TypeError

Ovanstående uttalande skulle helt enkelt ignoreras om du inte använder strikt läge, men nu vet du varför det inte körs som förväntat.

Det förhindrar dig också att utöka en ej utvidgbar egenskap.

var myObject = {name: "My Name"}
Object.preventExtensions(myObject);

function setAge() {
    myObject.age = 25;   // No errors
}

function setAge() {
    "use strict";
    myObject.age = 25;  // TypeError: can't define property "age": Object is not extensible
}

Beteende för en funktions argumentlista

arguments objekt uppför sig annorlunda i strikt och icke strikt läge. I icke-strikt läge kommer argument att återspegla förändringarna i värdet på de parametrar som finns, men i strikt läge kommer ändringar av parameterns värde inte att återspeglas i argument .

function add(a, b){
    console.log(arguments[0], arguments[1]); // Prints : 1,2

    a = 5, b = 10;

    console.log(arguments[0], arguments[1]); // Prints : 5,10
}

add(1, 2);

För ovanstående kod ändras arguments när vi ändrar värdet på parametrarna. Men för strikt läge kommer samma inte att återspeglas.

function add(a, b) {
    'use strict';

    console.log(arguments[0], arguments[1]); // Prints : 1,2

    a = 5, b = 10;

    console.log(arguments[0], arguments[1]); // Prints : 1,2
}

Det är värt att notera att om någon av parametrarna är undefined , och vi försöker ändra parameterns värde i både strikt läge eller icke-strikt läge, förblir arguments oförändrat.

Strikt läge

function add(a, b) {
    'use strict';

    console.log(arguments[0], arguments[1]); // undefined,undefined 
                                             // 1,undefined
    a = 5, b = 10;

    console.log(arguments[0], arguments[1]); // undefined,undefined
                                             // 1, undefined
}
add();
// undefined,undefined 
// undefined,undefined

add(1)
// 1, undefined
// 1, undefined

Icke-strikt läge

function add(a,b) {

    console.log(arguments[0],arguments[1]);

    a = 5, b = 10;

    console.log(arguments[0],arguments[1]);
}
add();
// undefined,undefined 
// undefined,undefined

add(1);
// 1, undefined
// 5, undefined

Duplicera parametrar

Strikt läge tillåter inte att du använder duplicerade funktionsparametrar namn.

function foo(bar, bar) {}  // No error. bar is set to the final argument when called

"use strict";
function foo(bar, bar) {}; // SyntaxError: duplicate formal argument bar

Funktionsomfattning i strikt läge

I strikt läge är funktioner som deklarerats i ett lokalt block otillgängliga utanför blocket.

"use strict";
{
  f(); // 'hi'
  function f() {console.log('hi');}
}
f(); // ReferenceError: f is not defined

Omfattningsvis har funktionsdeklarationer i strikt läge samma typ av bindning som let eller const .

Icke-enkla parameterlistor

function a(x = 5) {
  "use strict";
}

är ogiltigt JavaScript och kommer att kasta en SyntaxError eftersom du inte kan använda direktivet "use strict" i en funktion med icke-enkel parameterlista som den ovan - standardtilldelning x = 5

Icke-enkla parametrar inkluderar -

  • Standardtilldelning
function a(x = 1) {
  "use strict";
}
  • destrukturering
function a({ x }) {
  "use strict";
}
  • Vila params
function a(...args) {
  "use strict";
}


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow