javascript 闭包问题,为什么要写成闭包的形式?
PHPz
PHPz 2017-04-11 12:40:27
[JavaScript讨论组]

我看闭包是为了能让外部得到函数内部定义的局部变量。
那为什么一定要写成这样的形式呢?

function f1(){
    var n=999;
    function f2(){
      alert(n);
    }
    return f2;
  }
  var result=f1();
  result(); // 999

就直接return 不行么?像这样

function f1(){
    var n=123;
    return n;
}
x=f1();
alert(x);  ///123

这也是闭包么?

PHPz
PHPz

学习是最好的投资!

全部回复(6)
PHP中文网

首先,第二个肯定不是闭包,闭包是一个函数。
闭包一般用来隐藏或说保护我们的一些成员变量,通过闭包的形式返回出去一个能够操作我们保护起来的成员变量的函数。

    function f1(){
    var n=999;
    function f2(){
      alert(n++);
    }
    return f2;
  }
  var result=f1();
  result(); // 999
    result();// 1000
像上面这样,我们就能够访问f1的私有变量n,并且只能用每次+1的方式进行操作,一般来说闭包的使用像下面这样:
    var car = (function(){
            var _wheels = 4;

            return {
                setWheels : function(value){
                    if (value < _wheels) {
                      throw new Error('数值太小了!');
                    }
                    _wheels = value;
                },
                getWheels : function(){
                    return _wheels;
                }
            }

        })();
我们给汽车轮子数量赋值的时候,是要调用set方法的,是不能随便赋值的。
如果像你第二张方式写的:
function f1(){
    var obj={age : 10};
    return obj;
}
obj=f1();
obj.age = -100;
我们是不是把年龄赋值成-100了
阿神

后者不是闭包。
简单的说,闭包就是能够读取其他函数内部变量的函数

function f1(){
    var n=123;
    return n;
}
x=f1(); //返回的是一个值,这个值始终是123,无法改变
alert(x);  ///123

如果把第一个例子改成这样的形式

function f1(){

    var n= 999;
    var obj= {};
    obj.f2 = function(){
        console.log(n);
    }
    obj.add = function () {
        n++
    }
    return obj;
}
var result=f1();


result.f2(); // 999
result.add();
result.f2();//1000

这里返回的result可以即时的访问和修改f1里的变量n,
除了这种方法之外,外部没有方法可以改变n的值,相当于定义了一个特权方法。这就是闭包的作用,体会一下。

大家讲道理

楼主的理解有点狭隘了,
1,闭包不是为了让函数外部拿到内部变量。而是为了保护私有变量

2,return出来的是一个值,不是变量本身,此处的return是取得私有变量值的一种方法,跟闭包没有严格关系

天蓬老师

直接return出去是一个变量,而闭包是返回的一个执行环境。。。

怪我咯

首先你要理解闭包是什么? 说简单点就是一个函数,只是通过这个函数 可以在函数的外部去访问函数内部的变量。

PHP中文网

return 变量,只是返回值,我想问楼主如果想引用内部变量怎么办?

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号