2015-08-24 44 views
5
var example = function() { 
    console.log(typeof this); 
    return this; 
}; 

In modalità rigorosa: example.call('test') # prints 'string'Function.prototype.call altera il tipo di questo, al di fuori della modalità strict; perché?

In caso contrario, example.call('test') # prints 'object'

Tuttavia, console.log(example.call('test')) stampe test (come ci si aspetterebbe)

Perché Function.call cambiamento typeof 'test' === 'string' destinata a this all'interno example?

+2

Non è 'call' che cambia nulla. È la modalità sciatta che costringe il valore 'this' a un oggetto (qui, un oggetto' String'). – Bergi

risposta

5

Quando si utilizza call() e impostando l'argomento this per un valore di base, che valore di base viene sempre convertito in un oggetto, in modo da ottenere l'oggetto stringa invece della stringa primitiva

String {0: "t", 1: "e", 2: "s", 3: "t", length: 4, ... 

La documentazione per call() su MDN stati che

thisArg
Il valore di this fornito per la chiamata alla funzione.
noti che questo non può essere il valore effettivo visto dal metodo: se il metodo è una funzione in non-rigido codice modalità, null e undefined verranno sostituiti con l'oggetto globale, e valori primitivi saranno convertiti agli oggetti.

Quindi, in modalità non rigorosa il valore della stringa primitiva viene convertito in un oggetto, questo è anche specificato nel ECMA standard, Annex C

severa restrizione modalità e le eccezioni
Se this è valutato all'interno del codice di modalità rigoroso, quindi il valore this è non forzato a un oggetto.
A questo valore di null o undefined non viene convertito nell'oggetto globale ei valori primitivi non vengono convertiti in oggetti wrapper.
Il valore this passato tramite una chiamata di funzione (tra cui le chiamate effettuate utilizzando Function.prototype.apply e Function.prototype.call) non costringere il this valore passato a un oggetto

+0

Non una critica al tuo post, ma "inscatolato"? Perché le persone introducono inutilmente un gergo senza senso quando la specifica dice "molto più coerente" costretto a un oggetto "? – RobG

+0

@RobG - Chissà, è copia/incolla direttamente da MDN, che usa "boxed", quindi ho continuato a usare quel termine. – adeneo

+1

Non dice più "boxed". ;-) – RobG