闭包的查找变量顺序
//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指的是全局作用域中的变量。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步