zoukankan      html  css  js  c++  java
  • 再谈javascript中的闭包

    最近在看书学习的过程中,又碰到了闭包这个知识点,发现自己对于闭包的理解错了。

    还是先看一段代码,清晰地展示了闭包:

    function foo(){
    	var a =2;
    	function bar(){
    		console.log(a);
    	}
    	return bar;
    }
    var baz = foo();
    baz(); 		//2   这就是闭包
    

    解释:函数bar()的词法作用域能够访问到foo()的内部作用域,然后我们将函数bar()本身当做一个值类型进行传递出去了,在foo()执行后,其返回值(就是函数baz())复制给了变量baz并调用了baz(),实际上就是执行了内部函数bar(),但是函数bar()是在自己定义的词法作用域之外的地方执行了。

    在通常的情况下,函数foo()在执行完之后,整个内部作用域都会被垃圾回收机制回收并销毁的,但是因为闭包的存在,foo()的内部作用域并没有被销毁,因为函数bar()本身在使用内部作用域并持有对该作用域的引用,这个引用就是闭包了。

    再来看看闭包的代码:

    function foo(){
    	var a =2;
    	function baz(){
    		console.log(a);		//2
    	}
    	bar(baz);
    }
    
    function bar(fn){
    	fn();	//我就是闭包啦
    }
    

    也可以间接地传递:

    var fn;
    function foo(){
    	var a =2;
    	function bar(){
    		console.log(a);
    	}
    	fn = bar;
    }
    
    function baz(){
    	fn(); 	//我就是闭包啦
    }
    
    foo();
    baz();	//2
    

    闭包的作用?

    函数是可以记住并访问被定义时所在的词法作用域的,当函数在词法作用域之外执行的时候,这时就产生了闭包。

    当理解了这个概念,再回头看我写过的代码,就很容易发现闭包的影子,包括:定时器、事件监听器、AJAX请求或者其他异步任务中,只要是用了回调函数,实际上都是在使用闭包。

    以上是我对闭包的一些浅见,如有错误欢迎大家指出:)

    参考资料:《你不知道的JavaScript》

  • 相关阅读:
    ORACLE设置用户密码不过期
    oracle错误(ORA:12154 ORA:01034 和 ORA:27101 ORA-18008 ORA-01081)
    常用正则表达式整理
    JS中处理单个反斜杠(即转义字符的处理)
    SpringMVC 使用PUT请求遇到的问题小结
    Tomcat7 目录详解
    java对象之----(PO,VO,DAO,BO,POJO)
    Oracle使用触发器和mysql中使用触发器的比较
    Oracle 数据库中对记录进行分页处理
    PHPOffice下PHPWord生成Word2007(docx)使用方法
  • 原文地址:https://www.cnblogs.com/weapon-x/p/5306633.html
Copyright © 2011-2022 走看看