• 深入浅出之js闭包知识点梳理(一)


    简单认识闭包

      前言:和大多数编程语言一样,js也采用词法作用域,即函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的。函数对象可以通过作用域链关联起来,函数体内部的变量都可以保持在函数作用域内,这种特性在计算机文献中被称之为闭包含义是指函数变量可以被隐藏于作用域链之内,因此看起来函数将变量包裹起来了)。


    首先我们先来看一段代码:

    var scope = 'global scope'  //全局变量
    function checkScope(){
    	var scope = 'local scope';//局部变量
    	function f(){  //嵌套函数
    		console.log(scope);
    	};
    	return f()  //返回f执行结果
    };
    checkScope(); //运行结果 local scope;
    

      这段代码很容易看懂,在调用checkScope的时候,该函数内部把f的运行结果返回;
      下面我们把上面的代码稍加改造:

    var scope = 'global scope'  //全局变量
    function checkScope(){
    	var scope = 'local scope';//局部变量
    	function f(){  //嵌套函数
    		console.log(scope);
    	};
    	return f  //返回f执行结果
    };
    checkScope()(); //运行结果 local scope;
    

      现在在调用checkScope的时候返回的仅仅是一个函数对象,此时在checkScope外部调用这个函数对象,那么他里面的返回结果还是local scope而不是global scope;
      原理:js的执行用到了作用域链,这个作用域链是在函数定义时创建的。嵌套函数f定义在这个作用域链里,其中的scope一定是局部变量,不管任何时候执行f,这种绑定在执行f的时候依然有效。(闭包的这种特性强大到让人吃惊,它们可以捕捉到局部变量(和参数),并一直保存下来)。


    加入QQ群,和更多同道中人一起happy吧!!!
    86

  • 相关阅读:
    15、SQL基础整理(视图)
    14、SQL基础整理(存储过程)
    13、SQL基础整理(流程控制begin……end)
    12、SQL基础整理(运算符与优先级)
    11、SQL基础整理(变量)
    10、SQL基础整理(约束2)
    9、SQL基础整理(两表连接exists,join on,union)*Oracleも含む(INTERSECT&MINUS)
    20141113--SQL 事务
    20141111--SQL触发器
    20141110--SQL视图
  • 原文地址:https://www.cnblogs.com/7Ezreal/p/12057530.html
Copyright © 2020-2023  润新知