【问题标题】:what's the meaning of the closures in javascript?javascript中的闭包是什么意思?
【发布时间】:2015-11-27 18:38:25
【问题描述】:

来自网络

它说它可以像这样从外部访问函数内部的值:

function a(){           
    var scope = "local scope";
    function f(){return scope;}    
    return f; 
} 
console.log(a()());//it can get the value 'local scope'

我的问题是这段代码有什么不同

function a(){           
    var scope = "local scope"; 
    return scope; 
} 
console.log(a());//it can get the value 'local scope' too

那么闭包的含义是什么?

为什么需要通过包装function来返回值?

【问题讨论】:

  • 您是如何获得“需要”以这种方式编码的印象?
  • 不需要。这是闭包的演示
  • 除非您必须这样做,否则您不必这样做。同样的方式你不需要使用Math.random,直到你需要一个随机数。
  • how-do-javascript-closures-work 和其他几个可能重复
  • 伙计们,你真的没有比问题标题读得更远吗?

标签: javascript closures


【解决方案1】:

以下是闭包的一种可能用法:

var getUid = function () {
    var uid = 1;
    return function () {
        return uid++;
    };
};

// invoke the wrapping function immediately
// to create a single local scope
getUid = getUid();

getUid(); // 1
getUid(); // 2
getUid(); // 3

如您所见,闭包允许在函数调用之间保持“uid”局部变量“活动”。它的值保留在内存中,它是持久的,不像没有内部函数时:

var getUid = function () {
    var uid = 1;
    return uid++;
};

getUid(); // 1
getUid(); // 1
getUid(); // 1

总而言之,闭包的有趣之处在于能够使局部变量持久化。

在您的示例中,有一些值得注意的地方。注意写a()()和写(a())()是一样的。这意味着您首先调用包装函数“a”,这会创建一个新的作用域,因此,“a”中的所有内容都会被完全重新创建。

如果您继续以这种方式创建新范围,则没有理由使用闭包。事实上,这样做你失去了在函数调用之间保持变量活动的能力(如上所述)。让我们看看如果这样使用getUid() 会发生什么:

var getUid = function () {
    var uid = 1;
    return function () {
        return uid++;
    };
};

getUid()(); // 1
getUid()(); // 1
getUid()(); // 1

与没有内部函数的结果相同。不是很有用对吧?但是,如果您需要创建多个作用域,您仍然可以重复调用包装函数,但您必须将内部函数存储到变量中:

var getUidA = getUid(); // scope A
var getUidB = getUid(); // scope B

getUidA(); // A 1
getUidA(); // A 2
getUidB(); // B 1
getUidA(); // A 3
getUidB(); // B 2

我不确定关于闭包的基本原理还有很多话要说,其他程序员会判断。无论如何,如果您准备好头痛,您可能会对内存中低级别发生的事情感兴趣:https://stackoverflow.com/a/31778897/1636522

【讨论】:

  • 谢谢,这对我很有帮助!根据您的回答,我的理解是闭包可以创建类似对象的东西,例如您的 getUidA getUidB 可以独立存储自己的状态
  • @chanjianyi 我想我们可以这么说:-) 但我不会鼓励你用它来模拟对象。我不知道这是否是一种不好的做法,但至少它不是一种常见的做法:-/ 无论如何,不​​要害怕问是否还有灰色区域 :-)
  • XD 我发现一个参考似乎不错:developer.mozilla.org/en-US/docs/Web/JavaScript/Closures
  • @chanjianyi 我正要与你分享:-D 但我试图先改进这些旧答案:stackoverflow.com/a/20338699/1636522stackoverflow.com/a/20138888/1636522 :-)
【解决方案2】:

关于什么是闭包,请阅读这篇,最好的解释
JavaScript closures vs. anonymous functions

function a(){           
    var scope = "local scope"; 
    return scope; 
} 
console.log(a());

在这种情况下,您只能返回局部变量,如果需要,您无法对变量应用任何操作

function a(){           
    var scope = "local scope";
    function f(b){return scope + b;}    
    return f; 
} 
console.log(a()('found here'));
console.log(a()(' not found here'));

但在这种情况下,您可以根据需要操作该数据。

我的意思是说我们可能需要关闭。

【讨论】:

    猜你喜欢
    • 2014-02-08
    • 2017-02-17
    • 2017-06-11
    • 2013-11-02
    • 1970-01-01
    • 2015-07-15
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多