javascript - Function.prototype.call modifică typeof this, în afara modului strict; de ce?
var example = function () {
console.log(typeof this);
return this;
};
În modul strict: example.call('test') # afișează 'string'
Altfel, example.call('test') # afișează 'object'
Totuși, console.log(example.call('test')) afișează test (așa cum te-ai aștepta)
De ce schimbă Function.call typeof 'test' === 'string' legat de this în interiorul example?
Răspuns #1
Când folosești call() și setezi argumentul this la o valoare primitivă, acea valoare primitivă este întotdeauna convertită într-un obiect, astfel că obții obiectul string în locul stringului primitiv
String {0: "t", 1: "e", 2: "s", 3: "t", length: 4, ...
Documentația pentru call() pe MDN afirmă că
thisArg
Valoarea luithisfurnizată pentru apelul funcției.
Rețineți că aceasta s-ar putea să nu fie valoarea efectivă văzută de metodă: dacă metoda este o funcție în cod non-strict,nullșiundefinedvor fi înlocuite cu obiectul global, iar valorile primitive vor fi convertite în obiecte.
Deci, în modul non-strict, valoarea primitivă a șirului este convertită într-un obiect, acest lucru fiind specificat și în standardul ECMA, Anexa C
restricții și excepții în modul strict
Dacăthiseste evaluat într-un cod în modul strict, atunci valoareathisnu este forțată să devină un obiect.
O valoarethisdenullsauundefinednu este convertită în obiectul global, iar valorile primitive nu sunt convertite în obiecte wrapper.
Valoareathistransmisă printr-un apel de funcție (inclusiv apelurile efectuate folosindFunction.prototype.applyșiFunction.prototype.call) nu forțează conversia valoriithistransmise într-un obiect
