Ja, this
zu Fenstern auf dem Standard neigt, also warum mit new
gefährlich ist. Die Antwort auf, warum Sie erhalten undefined
beim Drucken von llf braucht ein bisschen mehr Code-Beispiele, um richtig zu erklären, werde ich das tun, wenn ich nach Hause komme, wie ich auf meinem Telefon im Moment bin
Edits: Zuerst habe ich gemacht eine Reihe von Kommentaren zu Ihrem ursprünglichen Code einige Probleme zu markieren fand ich
// Dont use new, its not needed here, use closures
// Also q is not declared here so it will become a global variable, bad bad bad
q=new function(){
// Both declarations are unneeded as you can just return q straight away
// and u never gets a value assigned to it so why declare it?
// If you want to compare with undefined then just write this !== undefined
// Also, refrain from using the same names in nested structures if you value your sanity
var u,q;
// Use either q = function(...){...} or function Q(...){...}
q=function Q(slf){
console.log('slf ⇒',slf);
// ex is not declared with var so this will create a global variable, bad bad bad
ex=q_ex.call(slf);
console.log('ex ⇒',ex);
};
// No need to write the function and then return it.
// Use return(function(...){...}) instead.
return q;
// Just a personal preference but I'd put this before the return
// statement to make it more readable and also use q_ex = function(...){...}
function q_ex(){
console.log('this ⇒',this);
return (this!==u && this!==null);
};
};
Unten ist, wie ich es
var q = (function(){ // Closure
var q_ex; // Declarations
q_ex = function() { // Internal function
console.log('this ⇒', this);
return (this!==undefined && this!==null);
};
return(function(slf) { // Returned function
console.log('slf ⇒', slf);
var ex = q_ex.call(slf);
console.log('ex ⇒', ex);
});
})(); // Call in the end to get returned function
q() // Returns the same as yours did
q(5) // A numeric object with the value of 5 is now set as 'this'
die Art und Weise Sie Ihr schrieb schreiben würde scheint wie meine das gleiche genau zu arbeiten, aber Ich kann es nicht genau verstehen. Könnte nur sein, dass ich zu tief in der Verschlussreligion bin.
Wie auch immer, das Problem, das Sie hatten, rührt von der Tatsache her, dass Sie q()
ohne Parameter ausführen. Wenn Sie q(5)
ausgeführt haben, sehen Sie, dass this
5 wird. Dies liegt daran, dass der this
-Parameter nicht angegeben wird, wenn er Window
lautet. Dies ist der Grund, warum new
oft gefährlich ist. Angenommen, Sie haben ein Objekt geschrieben, das this
darin verwendet, um Werte zu speichern, und daher mit new
erstellt werden muss. Nun, wenn jemand es erstellt und vergessen hat, new
zu verwenden, verschmutzen Sie den globalen Namespace, indem Sie alle Ihre Variablen an das Window
Objekt anhängen (Window
=== global im Browser). Ein guter Weg um dieses Risiko ist es, Ihre Objekte mit Verschlüssen zu schreiben, auf diese Weise, wie auch immer sie erstellt werden, sie arbeiten immer noch die gleichen. Sie können immer noch auf die Variablen zugreifen, die Sie von Ihrer Closing-Funktion verwenden möchten, indem Sie einfach ihren Namen verwenden oder wenn Sie sie gruppieren möchten, erstellen Sie einfach ein einzelnes "Master" -Objekt in Ihrer Closing-Funktion und fügen Sie alles hinzu.
Auch im Wesentlichen verbietet 'use strict'
einige schlechte Praktiken. Lesen Sie es auf und verwenden Sie es, macht das Leben leichter. Verwenden Sie auch oder einen anderen JavaScript-Qualitätsprüfer, um den Code sauber zu halten.
Hoffnung, die geholfen hat.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call#Parameters – undefined
Von dieser Referenz "*, wenn die Methode eine Funktion im nicht strikten Modus ist code, null und undefined werden durch das globale Objekt ersetzt. * " –
Verwenden Sie den strikten Modus und Sie erhalten wie erwartet" undefined ". – Bergi