例1:
-
var name = "The Window";
-
var object = {
-
name : "My Object",
-
getNameFunc : function(){
-
return function(){
-
return this.name;
-
};
-
}
-
};
-
alert(object.getNameFunc()());
输出:The Window ,如果去除this,则输出My object
例2:
-
var name = "The Window";
-
var object = {
-
name : "My Object",
-
getNameFunc : function(){
-
alert(this.name)
-
function a(){
-
return this.name;
-
};
-
return a;
-
}
-
};
-
alert(object.getNameFunc()());
输出:My Object,The Window,不管return this.name还是name都是输出The Window
其实最关键的就是要明白作用域链和闭包所起到的作用,其实闭包说到底就是一个函数,而且函数调用返回后其资源所占用的栈区并没有释放,所以变量就还保存在内存中,由于作用域链的关系,它会去寻找离其最近的var声明,var声明所在就是该闭包所在的层,从而在这层里面所得到的结果就是它最后的值,于是乎返回值也就是这个最终的值了.
结论:如果没有指定作用域,则函数执行的时候,查找相同的作用域声明,如果指定作用域,则根据指定的作用域查找声明,并且当一个函数作为函数而不是方法来调用的时候,this指向的是全局对象,(如例1所示);同理例2中由于返回的是函数,还没有执行,再执行过程中是全局对象,因此alert(object.getNameFunc()())永远返回The Window
阅读(333) | 评论(0) | 转发(0) |