Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写javascript闭包的正确方法_Javascript - Fatal编程技术网

编写javascript闭包的正确方法

编写javascript闭包的正确方法,javascript,Javascript,我正在学习javascript闭包 我有一个函数 function outer(x){ var y = 10; function inner(z){ return x + y + z; } console.log(inner(20)); } outer(30); 我得到的输出是60 这是闭包的一个好例子吗?关于闭包有很多误解。OP是词法作用域的一个例子,即“内部”函数可以访问外部函数的变量 有人认为ECMAScript中的每个函数都会与

我正在学习javascript闭包

我有一个函数

function outer(x){
     var y = 10;
     function inner(z){
         return x + y + z;
     }
     console.log(inner(20));
}
outer(30);
我得到的输出是60


这是闭包的一个好例子吗?

关于闭包有很多误解。OP是词法作用域的一个例子,即“内部”函数可以访问外部函数的变量

有人认为ECMAScript中的每个函数都会与其外部执行上下文形成一个闭包,但是这个定义并没有指出闭包更广泛、更强大的方面

下面演示了“每个函数都创建一个闭包”的概念

创建foo时,定义了它的作用域,并且它可以在全局执行上下文中访问x。当调用bar时,它会创建一个新的执行上下文并调用foo。由于foo的作用域链是基于代码中定义的位置而不是调用它的位置创建的,因此它将x解析为全局变量,而不是局部变量。因此foo对包含x(和所有其他全局变量)的全局执行上下文有一个闭包

这演示了ECMAScript的词法作用域性质和“普通”闭包。它不被利用,也不被允许继续存在,所以它是否真的存在只是猜测

闭包更显著的方面是在创建闭包的执行上下文完成后,利用闭包访问局部变量的能力,例如

var foo = (function() {
  var closureVariable = 'foo';
  return function() {
    console.log(closureVariable);
  }
}());

foo();  // 'foo'
在上面,立即调用的函数表达式(IIFE)使用名为closureVariable的变量创建执行上下文,并为其赋值。然后它返回一个内部函数对象,该对象的作用域链上有这个变量

一旦IIFE返回,返回的函数(现在由foo引用)仍然可以访问它的执行上下文。正是这种对完整执行上下文的持续访问,使得闭包能够利用对某些“特权”函数“私有”的共享变量,例如

var bar = (function() {
  var a;
  return {
    setA: function(value) {
            a = value;
    },
    getA: function() {
            return a;
    }
  }
}());

bar.setA(6);
console.log(bar.getA()); // 6 
方法setA和getA对创建它们的执行上下文有一个闭包,因此具有对a的共享特权访问。正是这种对不可访问变量的持久访问,才是闭包更重要的特性

在comp.lang.javascript常见问题解答中有更详尽的解释

还有道格拉斯·克罗克福德的

编辑
以上内容已被修改,以纳入comp.lang.javasscript:上关于闭包的长期讨论中的功能

对现有内容的简要回顾似乎表明,闭包的定义存在一些含糊不清的地方,具体来说,函数引用是否必须持久化或保持在封闭范围之外的某个位置才能被视为闭包。我知道狭义的闭包不是很有趣,大多数人用闭包这个词来指函数带有外部作用域的情况,但是你知道这个定义有什么明确的参考吗?上面的clj FAQ参考相当权威(主要作者是Richard Cornford,搜索他的),还有:
闭包…允许函数访问这些非局部变量,即使在其直接词法范围外调用也是如此。
。我确信还有其他引用,但这两个就足够了。@torazaburo您让我搜索示例,并在搜索过程中发现了一个关于该主题的早已被遗忘的线程。谢谢。我已经更新了如果你想在帖子中加入主题,请随时发表评论。:-)谢谢,非常好的信息。我想底线是“意见不同”。就我个人而言,我喜欢“非平凡闭包”这个术语。
var bar = (function() {
  var a;
  return {
    setA: function(value) {
            a = value;
    },
    getA: function() {
            return a;
    }
  }
}());

bar.setA(6);
console.log(bar.getA()); // 6