<!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>
还是给你逐一解释吧。
当定义
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