首页 > 其他 > 详细

作用域闭包、预解释和this关键字综合题目

时间:2015-01-25 13:49:37      阅读:314      评论:0      收藏:0      [点我收藏+]
var number = 2;
var obj = {number : 5,
    fn1 : ( function() {		 
	this.number *= 2;
	number=number*2;
 	var number=3;
		return function() {
			this.number *= 2;
			number*=3;
			alert(number);
		}
    } )()
};
var fn1 = obj.fn1;
alert(number);     
fn1();    
obj.fn1();   
alert(window.number);  
alert(obj.number); 

【解析】
1.fn1本身后面就有(),所以var fn1 = obj.fn1;时他已经被执行,但是里面的return function并没有被执行

2.alert(number);输出全局的number,本来是2,经过var fn1 = obj.fn1;后,相当于执行了

this.number *= 2;
number=number*2;
var number=3;

这三句话

注意:任何一个直接执行的匿名方法,他的this指向window

所以this.number *= 2;使得全局变量变成4,即输出4

而number=number*2;他是去看作用域块里的number,var number=3;作用域声明在先,但是没有赋值,所以number=number*2;这句话其实没用

3.执行到fn1();就是执行fn1里面的return function,也就是这三句话

this.number *= 2;
number*=3;
alert(number);

这时候依然是个匿名方法,所以this.number *= 2;使得全局变量变为8,number*=3;去找作用域块里的number,外层定义number为3,所以alert(number);就是9,如果是alert(this.number);则指向全局变量,即输出8

4.obj.fn1();,依然执行fn1里面的return function,也就是这三句话

this.number *= 2;

number*=3;

alert(number);

但这时this指向obj,this.number *= 2;使得obj里的number变为10,number*=3;还是去找作用域块,由于上面变为9,所以这里就是27,alert(number);输出的是作用域块的number,即27,如果是alert(this.number);则指向obj的number,即输出10

5.alert(window.number);经过上面几轮,全局变量变为8(即执行obj.fn1();对全局变量无影响)

6.alert(obj.number);只有这句话obj.fn1();,改变了obj.number,所以输出10

作用域闭包、预解释和this关键字综合题目

原文:http://www.cnblogs.com/zhangwenkan/p/4248106.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!