Heim > Artikel > Web-Frontend > JS-Verschlüsse und Timer
Dieses Mal bringe ich Ihnen JS-Verschlüsse und Timer Was sind die Vorsichtsmaßnahmen bei der Verwendung von JS-Verschlüssen und Timern?
Was ist ein Abschluss? Was macht er?
Ein Abschluss ist eine Funktion, die die internen Variablen anderer Funktionen lesen kann.
Funktion: 1. Sie können die Variablen innerhalb der Funktion lesen. 2. Die Werte dieser Variablen im Speicher behalten.
Welche Rolle spielt setTimeout 0?
Die JS-Ausführung basiert auf einem einzelnen Thread. Dies bedeutet, dass bei der Ausführung eines Codeabschnitts andere Codes in die Warteschlange gestellt werden, um zu warten, und nachfolgende Codes ausgeführt werden, sobald der Thread frei ist. Wenn im Code ein setTimeout festgelegt ist, fügt der Browser den Code zum entsprechenden Zeitpunkt in die Aufgabenwarteschlange ein. Wenn diese Zeit auf 0 gesetzt ist, bedeutet dies, dass er sofort in die Warteschlange eingefügt, aber nicht ausgeführt wird Sie müssen immer noch warten, bis der vorherige Code abgeschlossen ist (tatsächlich gibt es eine Verzögerung, je nach Browser beträgt sie 16 ms oder 4 ms). Daher garantiert setTimeout nicht die Ausführungszeit. Ob die Ausführung rechtzeitig erfolgt, hängt davon ab, ob der JavaScript-Thread überfüllt oder inaktiv ist.
Code
Was ist die Ausgabe des folgenden Codes? Ändern Sie den Code so, dass fnArr[i]() i ausgibt. Verwenden Sie mehr als zwei Methoden
var fnArr = []; for (var i = 0; i < 10; i ++) { fnArr[i] = function(){ return i; }; } console.log( fnArr3 ); //
Code:
Methode eins:
var fnArr = []; for (var i = 0; i < 10; i ++) { fnArr[i] = (function(){ var index = i; var fn = function(){ return index } return fn }()); } console.log( fnArr3 ); //
Methode zwei:
var fnArr = []; for (var i = 0; i < 10; i ++) { (function(n){ fnArr[i] = function(){ return n; } })(i) }; console.log( fnArr3 )
Verwenden Sie einen Verschluss, um ein Autoobjekt zu kapseln. Sie können den Auto-Status auf folgende Weise erhalten
var Car = //todo; Car.setSpeed(30); Car.getSpeed(); //30 Car.accelerate(); Car.getSpeed(); //40; Car.decelerate(); Car.decelerate(); Car.getSpeed(); //20 Car.getStatus(); // 'running'; Car.decelerate(); Car.decelerate(); Car.getStatus(); //'stop'; //Car.speed; //error
Code:
var Car = (function(){ var speed; function setSpeed(n){ speed = n } function getSpeed(){ return console.log(speed); } function accelerate(){ speed +=10 return speed; } function decelerate(){ speed -=10 return speed; } function getStatus(){ return console.log(speed===0?'stop':'running'); } return { setSpeed:setSpeed, getSpeed:getSpeed, accelerate:accelerate, decelerate:decelerate, getStatus:getStatus, } }()); Car.setSpeed(30); Car.getSpeed(); //30 Car.accelerate(); Car.getSpeed(); //40; Car.decelerate(); Car.decelerate(); Car.getSpeed(); //20 Car.getStatus(); // 'running'; Car.decelerate(); Car.decelerate(); Car.getStatus(); //'stop'; Car.speed(); //error
Schreiben Sie eine Funktion, um setTimeout zu verwenden, um die Funktion von setInterval zu simulieren
Code:
var i=0; function intv(){ setTimeout(function(){ console.log(i++); intv(); },1000); } intv();
Schreiben Sie eine Funktion, um die minimale Zeitgranularität von setTimeout zu berechnen
Code:
function getmin(){ var i = 0; var start = Date.now(); var clock = setTimeout(function(){ i++; if(i === 1000){ clearTimeout(clock); var end = Date.now(); console.log((end-start)/i) } clock = setTimeout(arguments.callee,0) },0) } getmin()
Was ist das Ausgabeergebnis des folgenden Codes?
var a = 1; setTimeout(function(){ a = 2; console.log(a); }, 0); var a ; console.log(a); a = 3; console.log(a);
Das Ausgabeergebnis dieses Codes ist 1;3;2, weil ein setTimeout ist im Code festgelegt, dann wird der Browser zum richtigen Zeitpunkt in die Aufgabenwarteschlange eingefügt. Wenn dieser Zeitpunkt auf 0 gesetzt ist, bedeutet dies, dass er sofort in die Warteschlange eingefügt, aber nicht sofort ausgeführt wird . Es muss noch auf die Ausführung des vorherigen Codes gewartet werden, daher muss setTimeout ausgeführt werden, nachdem der gesamte Code ausgeführt wurde (function(){a = 2;console.log(a);}, 0);.
Was ist das Ausgabeergebnis des folgenden Codes?
var flag = true; setTimeout(function(){ flag = false; },0) while(flag){} console.log(flag);
gibt das Ergebnis nicht aus, weil setTimeout(function(){flag = false;} ,0) wird ausgeführt, nachdem der gesamte Code ausgeführt wurde. Der Anfangswert von flag ist also true, sodass die Schleife fortgesetzt wird und auf console.log(flag) nicht zugegriffen werden kann. , daher ist es möglich, dass die Ausgabe wahr ist.
Was ist die Ausgabe des folgenden Codes? So geben Sie „Verzögerer: 0“, „Verzögerer: 1 ...“ aus (implementiert mit Schließungen)
for(var i=0;i<5;i++){ setTimeout(function(){ console.log('delayer:' + i ); }, 0); console.log(i); }
Code:
for(var i=0;i<5;i++){ (function(i){ setTimeout(function(){ console.log('delayer:' + i ); }, 0); })(i) console.log(i); }
Brain-burning-Frage
Was ist das Ergebnis des folgenden console.log? Warum?
function fn(a,b) { console.log(b); return { fn:function(c){ return fn(c,a); } }; } var a = fn(0); a.fn(1); a.fn(2); a.fn(3); var b = fn(0).fn(1).fn(2).fn(3); var c = fn(0).fn(1); c.fn(2); c.fn(3);
Ich glaube, dass Sie die Methode beherrschen, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website!
Verwandte Lektüre:
Einfacher CSS3-Klick-Antwort-Animationsfall
So verwenden Sie Python, um die Bildähnlichkeit zu bestimmen
Das obige ist der detaillierte Inhalt vonJS-Verschlüsse und Timer. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!