使用setTimeout指定变量的作用域
Scope of a variable using setTimeout
我很高兴它的工作,但仍然有点困惑的是什么"me"变量的范围是在下面的代码。使用了一段时间,但不知道为什么它工作。
var timer=function(){
this.timerMember=1;
this.timerID=0;
this.startTimer=function(){
var me=this;
this.timerID=setTimeout(function(){
//shares scope with this.startTimer
//timerMember is 2 here
console.log(me.timerMember);
// this is window
console.log(this);
// me doesn't exist in window
console.log(this.me);
},0);
// this code gets executed before anonymous
// timer function
// clearTimeout(this.timerID);
this.timerMember++;
}
}
var t=new timer();
t.startTimer();
传递给setTimeout的匿名函数似乎与timer共享作用域。当匿名函数执行(me. timermemer =2)时,startTimer显然已经完成,所以当startTimer完成时,me变量应该超出范围。对我来说幸运的是,JavaScript保留它,直到匿名函数被执行(适用于所有浏览器),但我想知道这是否是正确的方式。这种行为是有意为之还是偶然的幸运?
这是设计。这叫做闭包。
当一个函数在另一个函数中定义时,外部函数中的局部变量被放在闭包中,这样即使在外部函数结束后,它们也可以继续存在。内部函数保留闭包,以便以后可以访问变量。
相关文章:
- 当我更新另一个作用域变量时,作用域变量会自动更新
- 如何在隔离作用域指令中访问此作用域变量
- 正在向构造函数添加作用域变量
- 如何在angularjs中将多个作用域变量传递到自定义指令中
- 作用域变量未从状态父控制器继承到子控制器
- 插槽:访问作用域变量
- 在另一个作用域变量中使用AngularJS作用域变量
- 在Angular.js中通过检查作用域变量进行过滤
- 如何更新作为属性传入的作用域变量
- Node.js中的垃圾收集作用域-变量将保持设置状态多长时间
- 从$http.get调用更新Angular作用域变量
- AngularJS ui路由器:访问子作用域变量
- 访问AngularJS中函数中的作用域变量
- 为什么Angular 1.5双向绑定在将作用域变量传递给组件绑定时失败
- 修改作用域变量后,未更新作用域绑定
- 控制器作用域变量在刷新之前未加载
- 将Angular作用域变量的字符串描述传递给指令
- 将内部作用域变量绑定到外部“模板”
- 无法在 $.post 回调中设置作用域变量
- 如何从在 JS 中用作参数的匿名函数中分配外部作用域变量