//var n=9; function f1(){ //n=99; function f2(){ var n=999; console.log(n); } return f2; } var result=f1(); result(); // 999 //先在f2中查找有没有变量n,再在f1中查找有没有变量n,最后在全局作用域中查找有没有变量n
看下面这几个例子就知道闭包的查找顺序了(其实就是根据函数的作用域链来查找)
var name="xiu"; var obj={ name:"xie", getName:function(){ return function(){ var name="baobao"; return name; } } } alert(obj.getName()());//baobao
var name="xiu"; var obj={ name:"xie", getName:function(){ var name="xiubaoba"; return function(){ return name; } } } alert(obj.getName()());//xiubaobao
var name="xiu"; var obj={ name:"xie", getName:function(){ return function(){ return name; } } } alert(obj.getName()());//xiu
var name="xiu"; var obj={ name:"xie", getName:function(){ return function(){ var name="baobao"; return this.name; } } } alert(obj.getName()());//xiu
var name="xiu"; var obj={ name:"xie", getName:function(){ return function(){ return this.name; } } } alert(obj.getName()());//xiu
function test(){ return function(){ var str="222"; return this.str; } } console.log(test()());//undefined,测试是undefined,this指向的是全局作用对象window
function test(){
var str="123";
return function(){
var str="222";
return this.str;
}
}
console.log(test()());//undefined,还是指向window全局对象
var str="xiuxiu";
function test(){
var str="123";
return function(){
var str="222";
return this.str;
}
}
console.log(test()());//xiuxiu,指向全局作用对象window打的全局变量str
var name="xiu"; var obj={ name:"xie", getName:function(){ var that = this; return function(){ return that.name; } } } alert(obj.getName()());//xie
总结:没有this的情况下,查找顺序是从内到外,所以先从函数内部寻找变量,一级一级往上查找,如果没有就找全局变量
有this的情况下,因为返回的函数处在全局作用域中,所以this指的是全局作用域中的变量。