Интервал никогда не останавливается ... Может кто-нибудь объяснить?
Переменные запертые в области замыкания является причиной того, следующий код будет использовать переменную O в той же области, которая устанавливает о пустое значение.
Примечание: Я предпочитаю использовать создателей закрытий для ограничения объема и предотвращения других сюрпризов. Следующее создаст закрытие, на котором они летают, чтобы сохранить код простым.
var o = {};
setTimeout(function(){//closure accessing o directly
console.log("why is o null here:",o);
},100);
o=null;
Следующий код будет использовать, как о прошло о, прошел о теперь ловушку в созданной области закрытия и установки о пустом значении не влияет на переданные о. Мутирование o (o.something = 22) повлияет на пройденный o.(Google «JavaScript по ссылке на значение» для ссылок)
var o = {};
setTimeout((function(o){
return function(){//closure accessing passed o
console.log("why is o not here:",o);
};
}(o)),100);
o=null;
Для решения общей проблемы в петли создания closurs вы передаете переменную (I) на функцию, которая возвращает замыкание
for(var i = 0;i<10;i++){
setTimeout((function(i){
return function(){//not using i in the for loop but the passed one
console.log("and i is:",i);//0 to 9
};
}(i)),100);
}
Поскольку имеющий переменный я в том же объеме, что и закрытие даст вам нежелательные результаты:
for(var i = 0;i<10;i++){
setTimeout(function(){
console.log("and i is:",i);//10 times and i is: 10
},100);
}
Почему periodic.go = «» работает что-то делать с пропуском по значению по ссылке. Как это работает показано в следующем коде:
function test(o){
o=22;//no mutation but an assignment
}
var o = {name:"me"};
test(o);
console.log(o);//Object { name="me" }
function test2(o){
o.name="you";//mutates
}
test2(o);
console.log(o);//Object { name="you"}
Как решить
Я изменил код немного, чтобы воспользоваться ProType для общих членов (функция Go) и создать замыкания чтобы убедиться, что объем закрытия ограничен тем, что вам действительно нужно.
Для получения более подробной информации читайте introduction to constructor function and the this variable.
function MyInterval(){//capitalize constructor
this.name = 'Paul';
this.doContinue = true;
this.timeoutid = false;
};
MyInterval.prototype.closures ={//creates closures with limited scope
//closure for the go function setting the invoking object
go:function(me){
return function(){
console.log("In go, name is:",me.name);
me.go();
//de reference "me", we no longer need it
// can't do this in a setInterval though
me=null;
};
}
}
MyInterval.prototype.go = function(){
if(this.constructor===MyInterval){
//if you were to call go multiple times
if(this.timeoutid)
clearTimeout(this.timeoutid);
//do it again if this.doContinue is true
this.timeoutid = (this.doContinue)? setTimeout(
this.closures.go(this)
//creates a closure function
,100
):false;
return;
};
console.log("this is not the correct value:",this);
};
//added stop, good call from shadow, now you can stop immediately
// or set doContinue to false and let it run it's course
MyInterval.prototype.stop = function(){
if(this.timeoutid)
clearTimeout(this.timeoutid);
this.timeoutid=false;
};
periodic = new MyInterval();
periodic.go();
//because the clearTimeout you can accedentally do something silly like:
periodic.go();
periodic.go();
setTimeout(function(){
periodic.name='George';
}, 150);
setTimeout(function(){
periodic.name ='John';
periodic.doContinue = false;
periodic.name = 'Ringo'
}, 250);
'Интервал никогда не останавливается ... Может кто-нибудь объяснить,' Обновление моего ответа на этот вопрос решить – HMR