search

Home  >  Q&A  >  body text

javascript - 关于js的闭包

代码一 (function(){var a=20; window.func=function(){alert(a)}})()

代码二var func=(function(){var a=20; return function(){alert(a)}})()

代码一这种形式是闭包么?俩个函数都可以一直访问a变量,他们的区别是什么

闭包的形成 必须有return关键字吗?

PHP中文网PHP中文网2832 days ago628

reply all(8)I'll reply

  • PHP中文网

    PHP中文网2017-04-10 14:35:40

    一般来讲,js的所有函数都是闭包,但是匿名函数可以在其它函数内部创建,而且可以访问到外层的局部变量,相对来讲功能比较强一点。然而这两种函数都一样,return可有可无。如果一个函数没有return,那它的返回值默认是undefined

    reply
    0
  • 迷茫

    迷茫2017-04-10 14:35:40

    代码一是闭包,把a的值每次加1测试下就ok了。
    两者区别就是,代码一中func是内部函数,并且func被挂载到window下,所以func可以直接调用。代码二中func是外部函数并且被立即执行了,内部函数被当作返回值返回了,所以代码二func()时,也是直接调用的内部函数。
    从结果来说两者是相同的,只是实现的方式略有不同。

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 14:35:40

    子函数能够使用其父函数作用域的变量称为闭包.

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 14:35:40

    接着楼上的说法 楼主所理解的闭包实际上是说a的值是不是能一直被保存调用 而如一楼所说广义上任何函数都是闭包 嵌套函数的闭包应该是要靠返回值 或者是保存到某属性里
    或者用第3,4,5种写法 把return的匿名函数拆开 是一样的 最后 你代码写个分号吧
    其实引用了就可以不一定要return
    参考这个帖子我楼上和我的回答
    http://segmentfault.com/q/1010000000397999#a-1020000000644788


    function first() { var firstVar = 'first'; function second () { var firstVar = 'second'; return firstVar; } return second(); } console.log(first()); var func = (function(){ var a = 20; function func2() { return a; } return func2; })(); console.log(func()); function firstFunc() { var firstVar = 'first'; return (function second () { return firstVar; }()); } console.log(firstFunc());

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 14:35:40

    JS是词法作用域,函数可以访问它定义时的作用域中的变量

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 14:35:40

    不见得就得返回return,比如:
    1.事件回调

    javascriptvar lists = document.querySelectorAll('#items>li');
    for (var i = 0, j = lists.length; i < j; i++) {
        lists[i].onclick = function() {
            alert(i);
            // console.log(this.i);
        };
    }
    

    2.定时器

    javascriptfor(var i=0;i<6;i++){
        setTimeout(function(){
            console.log(i);
        },6000);
    }
    

    reply
    0
  • PHPz

    PHPz2017-04-10 14:35:40

    首先,闭包就是返回的一个函数,以及这个函数在定义的时候与之相关联的环境变量。

    javascript(function(){var a=20; window.func=function(){alert(a)}})() //代码一
    

    代码一是一个立即执行的函数,开始时把局部变量a赋值为20,然后定义了一个全局函数func(),
    如果调用func(),则可以访问变量a,代码一中的func()只是一个全局函数,但是它定义时的位置决定了局部变量a对这个函数是可见的,所以可以访问,func()不是闭包。

    javascriptvar func=(function(){var a=20; return function(){alert(a)}})() //代码二
    

    代码二是一个闭包,因为立即执行的匿名函数的返回值是一个函数,并且返回的那个函数有着与其相关联的局部变量a,所以当把这个函数赋值给func时,相当于a对于func()这个函数也是可见的,所以可以访问a。func()是闭包。

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 14:35:40

    闭包就是从外层可以获取局部变量的引用。return只是一种方式,把内部函数或者局部变量返回给外界;全局属性的赋值也是一种形式。
    代码一和代码二都是闭包。

    reply
    0
  • Cancelreply