Compatibilità in modalità rigida JavaScript

0

Durante la lettura della modalità rigorosa su MDN sono rimasto davvero sorpreso per leggere quanto segue verso la fine della pagina, citare:

Browsers don't reliably implement strict mode yet, so don't blindly depend on it. Strict mode changes semantics. Relying on those changes will cause mistakes and errors in browsers which don't implement strict mode. Exercise caution in using strict mode, and back up reliance on strict mode with feature tests that check whether relevant parts of strict mode are implemented. Finally, make sure to test your code in browsers that do and don't support strict mode. If you test only in browsers that don't support strict mode, you're very likely to have problems in browsers that do, and vice versa.

Per quanto ho capito, la modalità strict è un insieme ridimensionato di modalità "nonstict", quindi non riesco a immaginare situazioni in cui il codice strict non può essere eseguito correttamente in un browser non forzato. Quindi, la domanda è questa affermazione ha davvero senso? È la situazione in cui l'opzione "non forzata" restrittiva renderà il codice non valido?

    
posta Petr Abdulin 12.05.2014 - 09:47
fonte

1 risposta

4

La modalità rigorosa non è solo una funzionalità ridotta dalla modalità "non rigida". C'è anche qualche funzionalità modificata. Diciamo che vorremmo scrivere il seguente codice ES6:

function callOnObjectWithArgs(fn, obj, ...args) {
    fn.apply(obj, args);
}

Ma poiché i browser non hanno ancora implementato l'operatore di rest (...), potremmo fare qualcosa di simile in modalità rigorosa:

function callOnObjectWithArgs(fn, obj) {
    "use strict";
    var splice = Array.prototype.splice;
    splice.call(arguments, 0, 2); // Remove the first 2 elements (fn & obj)
    fn.apply(obj, arguments);
}

callOnObjectWithArgs(console.log, console, 1, 2, 3); // -> 1 2 3

Tuttavia, questo codice non funzionerebbe in modalità "non rigida".

// Using callOnObjectWithArgs without the "strict mode"; invocation
callOnObjectWithArgs(console.log, console, 1, 2, 3) // -> TypeError: undefined is not a function

Questo perché rimuovendo i primi due elementi dall'oggetto arguments , fn e obj non puntano più ai primi due parametri passati alla funzione, ma dovrebbero quindi puntare a ciò che era arguments[2] e arguments[3] prima della rimozione dei primi due elementi ( 1 e 2 ). Questo perché in modalità "non rigida", i parametri di funzione denominati puntano sempre agli indici corrispondenti nell'oggetto arguments , mentre i parametri denominati in modalità strict non sono associati all'oggetto arguments in alcun modo.

Questo è il motivo per cui dovresti sempre scrivere un codice che sia compatibile sia con la modalità rigorosa che regolare.

    
risposta data 22.11.2014 - 20:34
fonte

Leggi altre domande sui tag