zoukankan      html  css  js  c++  java
  • 闭包的查找变量顺序

    //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指的是全局作用域中的变量。

  • 相关阅读:
    vue typescript 父子组件间值的传递
    flex 布局列表自动换行
    css文字两端对齐
    webstorm windows 常用快捷键
    vue elmentUi el-scrollbar 美化滚动条样式
    简述在Vue脚手架中,组件以及父子组件(非父子组件)之间的传值
    简述Vue的实例属性、实例方法
    Js基本类型中常用的方法总结
    简述Vue中的过滤器
    简述Vue中的计算属性
  • 原文地址:https://www.cnblogs.com/aixiuxiu/p/6544075.html
Copyright © 2011-2022 走看看