<!DOCTYPE html >
<html >
<head>
<title> new document </title>
<meta charset="utf-8" />
</head>
<body>
<script>
var number=2;
var obj={
number:4,
/*匿名函数自调*/
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);
}
})(),
db2:function(){
this.number*=2;
}
}
var fn1=obj.fn1;
alert(number);//4....
fn1();//9
obj.fn1();//27
alert(window.number);//8....
alert(obj.number);//8
</script>
</body>
</html>
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
还是给你逐一解释吧。
当定义
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