2016-04-05 12 views
6

Ho trovato un caso interessante in cui "use strict" non funziona come previsto in javascript. le seguenti funzioniusa strict in javascript non funziona per la fat fat?

"use strict"; 

var y =() => { 
    console.log(this); 
} 

var x = function() { 
    console.log(this); 
} 

x(); // undefined due to use strict 
y(); // window object 

Penso contesto freccia grassi dovrebbero essere sovrascritti da indefinita, o è la mia ipotesi che non va?

+1

Poiché si sta eseguendo questo nell'ambito globale (dove 'this' è l'oggetto' window'), e 'this' nelle funzioni freccia è lessicale, non vedo cosa c'è di inaspettato in questo? – Bergi

risposta

7

MDN dice di arrow functions:

Rapporti con modalità rigorosa

Dato che this è lessicale, rigide regole della modalità in materia di this vengono semplicemente ignorati.

var f =() => {'use strict'; return this}; 
f() === window; // or the global object 

Le regole lessicali this hanno la precedenza rispetto rigoroso-mode this regole.

Lo vediamo facilmente nella specifica ES2015 esaminando la descrizione piana inglese di possibili valori per a function's [[ThisMode]] slot, che può essere lexical, strict o global:

Definisce come this riferimenti vengono interpretati nel parametri formali e codice del corpo della funzione. lexical significa che this si riferisce al valore this di una funzione di inclusione lessicale. strict significa che il valore this viene utilizzato esattamente come previsto da una chiamata della funzione. global significa che un valore this di undefined viene interpretato come riferimento all'oggetto globale.

In altre parole, il comportamento di una funzione this può essere rigoroso, non rigido o lessicale. Se la funzione [[ThisMode]] è lessicale (come per una funzione freccia), rende irrilevante lo stato severo/non rigoroso della funzione allo scopo di determinare il comportamento di impostazione this.

Problemi correlati