闭包的查找变量顺序

复制代码
//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
复制代码

 

1
2
3
4
5
6
7
function test(){
    return function(){
        var str="222";
        return this.str;
    }
}
console.log(test()());//undefined,测试是undefined,this指向的是全局作用对象window

  

1
2
3
4
5
6
7
8
function test(){
    var str="123";
    return function(){
        var str="222";
        return this.str;
    }
}
console.log(test()());//undefined,还是指向window全局对象

  

1
2
3
4
5
6
7
8
9
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指的是全局作用域中的变量。

posted @   我啊我  阅读(225)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示