扫码关注官方订阅号
还是给你逐一解释吧。
var number=2; var obj={ number:4, fn1:(function(){ // 匿名函数1 var number; this.number*=2;// (1) number=number*2;// (2) number=3; return function(){ // 匿名函数(2) var num=this.number; this.number*=2; console.log(num); number*=3; alert(number); } })(), db2:function(){ this.number*=2; } } var fn1=obj.fn1; // (3) alert(number);// (4) fn1();// (5) obj.fn1();// (6) alert(window.number); alert(obj.number);
当定义obj的时候执行了匿名函数1,此时处于全局作用域内,因此上下文this是window。执行完语句(1)导致全局变量number的值变为4;执行语句(2)时临时变量number还没有被赋值,所以是NaN,但下一句会将其赋值为3;最后,匿名函数1返回了匿名函数2,因此obj.fn1=匿名函数2。(注意匿名函数2里面会用到临时变量number,老生常谈的闭包)
obj
匿名函数1
this
window
语句(1)
number
4
语句(2)
NaN
3
匿名函数2
obj.fn1=匿名函数2
来到语句(3),这句会把fn1这个变量赋值为obj.fn1,也就是匿名函数2
语句(3)
fn1
obj.fn1
由于全局变量number已经在语句(1)中变为了4,所以语句(4)弹出的对话框结果为4
语句(4)
语句(5)执行的是fn1(),它与执行obj.fn1()的区别是两者this不一样。前者为null,而后者this为obj。但是又由于JS规定,this为null时相当于全局对象window,所以这句代码执行时函数的this为window。在匿名函数2里会将全局变量number更新为8,同时将匿名函数1中被闭包的临时变量number更新为9
语句(5)
fn1()
obj.fn1()
null
8
9
语句(6)的效果在上面已经分析过了,this是obj,所以obj.number更新为8,闭包的number更新为27
语句(6)
obj.number
27
//obj里面的那些值可以理解吧 var fn1=obj.fn1; //到这句的时候,你把它理解成 fn1跟obj.fn1指向通过地址,然后那个地址里面的内容,也就是下面这段 /* (function(){ var number; //this.number*=2;//4 //number=number*2;//NaN number=3; return function(){ var num=this.number; this.number*=2;//6 console.log(num); number*=3;//9 alert(number); } })() */ 这时候的执行环境是在window下面,因此这时候的this指向的是window,所以this.number 是2,上面那段代码的return function 里面 this.number*=2 //4 改变了外面的number值,所以alert(number);//4.... /* 至于 fn1();//9 fn1执行的是返回的函数 return function(){ var num=this.number; this.number*=2;//6 console.log(num); number*=3;//9 alert(number); } 这里由于作用域的原因,找到的是它外面那个函数定义的 number=3;所以输出了9,还就就是这里的this指向的是window,因此this.number 又*2=8(alert(window.number);//8....); */ /* obj.fn1();//27 这里在执行obj.fn1()的时候,this指向的是obj,上面obj的number 已经是 9了,这回又*3=27 */
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
还是给你逐一解释吧。
当定义
obj的时候执行了匿名函数1,此时处于全局作用域内,因此上下文this是window。执行完语句(1)导致全局变量number的值变为4;执行语句(2)时临时变量number还没有被赋值,所以是NaN,但下一句会将其赋值为3;最后,匿名函数1返回了匿名函数2,因此obj.fn1=匿名函数2。(注意匿名函数2里面会用到临时变量number,老生常谈的闭包)来到
语句(3),这句会把fn1这个变量赋值为obj.fn1,也就是匿名函数2由于全局变量
number已经在语句(1)中变为了4,所以语句(4)弹出的对话框结果为4语句(5)执行的是fn1(),它与执行obj.fn1()的区别是两者this不一样。前者为null,而后者this为obj。但是又由于JS规定,this为null时相当于全局对象window,所以这句代码执行时函数的this为window。在匿名函数2里会将全局变量number更新为8,同时将匿名函数1中被闭包的临时变量number更新为9语句(6)的效果在上面已经分析过了,this是obj,所以obj.number更新为8,闭包的number更新为27