标签:turn 键值 return strong 执行 包含 变量 函数返回 font
问题如下:
var num = 1;
var obj={
num : 8,
nm : (function(){
this.num *=2;
return function(){
return this.num *=2;
}
})()
}
var dbl = obj.nm;
obj.nm();
obj.nm();
obj.nm();
console.log(obj.num);//64
console.log(this.num);//2
解释:
上述问题中其实就是this的指向问题,this指向明白了自然就清楚了!
首先看第一句:
//这句是声明了一个全局变量num=1;(这里没什么解释的,如果这都不明白就去从js基础学习吧)
var num = 1;
//接下来以字面量的方式创建了一个对象obj,包含两个键值对;
var obj={
//num,obj的共有属性,值为8;
num : 8,
//nm的值是一个闭包函数(自执行函数);
nm : (function(){
//这里是重点了!!!不管执行或者不执行obj.nm()闭包函数都是执行的,并不是obj.nm()调用的,因此这里的this指的是window;
console.log(this);//window
this.num *=2;
//当执行obj.nm()时,会将下面这个函数返回给obj,也就是说里面的函数中的this才是指向obj的,可以说是谁调用的函数,this就指向谁,因此这里的this指向obj;
return function(){
console.log(this);//obj
return this.num *=2;
}
})()
}
//这里是用来骗人的!执行或者不执行,window.num = 2,obj.num=8;(闭包函数自己调用了一次,所以开始定义的全局num*2=2;)
var dbl = obj.nm;
//执行下面后,nm的值也就是闭包函数中的return的函数被执行了,因为闭包函数是自执行函数,obj.num()没资格调用它,调用的是返回给obj.num()的函数;
//执行后window.num=2;(obj.num()调用的是obj.num),obj.num=16;
obj.nm();
//同理,下面的obj.num()都是执行的obj.num*2;此时window.num = 2;obj.num = 32;
obj.nm();
//window.num = 2;obj.num = 64;
obj.nm();
//此时输出结果,结果必然为window.num = 2,obj.num = 64;
console.log(obj.num);//64
console.log(this.num);//2,这里的this指的是window
标签:turn 键值 return strong 执行 包含 变量 函数返回 font
原文地址:http://www.cnblogs.com/DIEW/p/6049069.html