Heim > Fragen und Antworten > Hauptteil
function Box(age) {
this.name = 'ss';
this.age = age;
this.flag = true;
return this;
} //定义一个构造函数
var box1 = new Box(10); // new出一个实例
setTimeout(function () {
box1.flag = false;
console.log(box1.flag);
}, 5000); //五秒钟之后把 实例box1里面的flag变为false.
var inter = setInterval(function () {
if (box1) {
console.log(box1);
if (!box1.flag) {
box1 = null;
var box1 = new Box(20);
}
} else {
console.log('cleared Interval as box1 is null now');
clearInterval(inter);
}
}, 1000); //每一秒种先控制台打印出box1, 如果flag为false, 那么就销毁box1,然后再new出一个box1.
Das Ergebnis ist, dass die direkte Ausgabe box1 null ist.
cleared Interval as box1 is null now
false
Liegt es daran, dass var zuerst lokale Variablen deklariert, was dazu führt, dass box = null direkt nach der Deklaration ausgegeben wird?
phpcn_u15822017-06-12 09:31:36
既然你有疑问,把var去掉才看看结果不就知道了?
确实是变量提升,不妨在定时器里先输出box1是啥
var inter = setInterval(function () {
console.log(box1);
if (box1) {
console.log(box1);
if (!box1.flag) {
box1 = null;
var box1 = new Box(20);
}
} else {
console.log('cleared Interval as box1 is null now');
clearInterval(inter);
}
},1000);
结果是先输出undefined
不是你认为的null。
实际上相当于
var inter = setInterval(function () {
var box1;
if (box1) {
console.log(box1);
if (!box1.flag) {
box1 = null;
box1 = new Box(20);
}
} else {
console.log('cleared Interval as box1 is null now');
clearInterval(inter);
}
},1000)
于是呢,定时器刚到点触发,发现声明了box1,但实际赋值还没开始,所以if走else路线