2016-02-28 8 views
6

Ho letto quanto segue su un sito web:JS: Cos'è la "coercizione"? Che cosa ha a che fare l'use-strict con questo?

Usa-stretto ha un vantaggio. Elimina questa coercizione. Senza la modalità strict , un riferimento a questo valore di null o undefined è forzato automaticamente al globale. Questo può causare molti attacchi di testa e il tipo di bug pull-out-your-hair. In modalità rigorosa, facendo riferimento a a questo valore null o undefined genera un errore.

Che cosa significa esattamente questo? Che cosa ha a che fare l'uso-strict con la coercizione this?

+2

Cosa sai già di 'questo'? (Una spiegazione dovrebbe iniziare con le basi di ciò che "questo" è usato in senso generale, o ...?) – nnnnnn

+3

Il testo che hai citato sembra spiegare cosa significhi "questa coercizione" (in questo contesto). Cosa esattamente non capisci? La descrizione non è molto precisa: * "In modalità rigorosa, facendo riferimento a a questo valore di null o undefined genera un errore." * Ovviamente non è vero. L'accesso a 'this' stesso non genera un errore. 'questo qualcosa. –

+0

Questo [link] (http://stackoverflow.com/a/11496488/452708) potrebbe dare alcuni spunti. – Abhijeet

risposta

2

Quando si chiama una funzione in javascript, 'questo' farà riferimento a cose diverse a seconda del contesto:

  1. Se la funzione è stata vincolata, il 'questo' sarà impostato a qualsiasi essa era obbligato ad es fn.bind(x)()

  2. Se invocato la funzione utilizzando fn.call(x) o fn.apply(x), il questo sarà impostato su x.

  3. Se la funzione è stata definita utilizzando la notazione freccia, poi il this sarà tutto ciò è stata definita per essere this quando la funzione era definita.

  4. Se si chiama la funzione con thing.fn(), il this è ciò che è prima del '', in questa 'cosa' caso.

  5. Se sei in un costruttore, chiama con new quindi this fa riferimento a il nuovo oggetto in costruzione.

  6. Se sono solo chiamando una funzione nuda, che non è su qualsiasi oggetto, che non è legato, che non è una funzione di freccia e si sta chiamando è in modo diretto, senza l'utilizzo di chiamare o applicare, quindi lo this farà riferimento all'oggetto globale se non si è in modalità rigorosa, e indefinito se si è in modalità rigorosa. Questo è il riferimento a come "questa coercizione" dalla citazione.

Ecco perché, se si apre una console browser e digitare

Function('console.log(this)')()

la console sarà in uscita la finestra che è l'oggetto globale nel browser. Tuttavia, se si apre la console e digitare

Function('"use strict";console.log(this)')()

console registrerà undefined.

Qui sto utilizzando il costruttore di funzioni, perché è un modo per forzare l'uso della modalità non rigida indipendentemente dalla situazione in cui appare, quindi questi esempi dovrebbero comunque funzionare, anche se li si esegue da un file o console che opera in modalità rigorosa.

this la coercizione può essere il modo più conveniente di ottenere l'oggetto globale, vale a dire

const global = Function('return this')()

opere sia nel browser e del nodo, anche in modalità rigorosa.

Ma la maggior parte delle volte, si vuole fallire in fretta, e avere funzioni che ci si aspetta di operare su specifici tipi di istanze effettivamente operanti sul proprio oggetto globale può rovinare le cose. Avere tentativi di scrivere qualcosa o leggere qualcosa da this genera eccezioni quando non è definito è quasi sempre meglio che leggere e scrivere sull'oggetto globale.