Quando si chiama una funzione in javascript, 'questo' farà riferimento a cose diverse a seconda del contesto:
Se la funzione è stata vincolata, il 'questo' sarà impostato a qualsiasi essa era obbligato ad es fn.bind(x)()
Se invocato la funzione utilizzando fn.call(x)
o fn.apply(x)
, il questo sarà impostato su x.
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.
Se si chiama la funzione con thing.fn()
, il this
è ciò che è prima del '', in questa 'cosa' caso.
Se sei in un costruttore, chiama con new
quindi this
fa riferimento a il nuovo oggetto in costruzione.
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.
Cosa sai già di 'questo'? (Una spiegazione dovrebbe iniziare con le basi di ciò che "questo" è usato in senso generale, o ...?) – nnnnnn
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. –
Questo [link] (http://stackoverflow.com/a/11496488/452708) potrebbe dare alcuni spunti. – Abhijeet