Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.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_Binding_Closures_Scope Chain - Fatal编程技术网

javascript闭包和范围链示例

javascript闭包和范围链示例,javascript,binding,closures,scope-chain,Javascript,Binding,Closures,Scope Chain,有人能向我解释一下(清楚而简洁)为什么这段代码是这样工作的吗?我来自Java(6和7)的强类型背景,在Java中闭包不存在,也不像javascript中那样工作。我认为与这个问题相关的概念是:闭包和范围链 下面是一个例子: var myfuncs = function() { var funcs = [] var i; for (i = 0; i < 10; i++) { funcs[i] = function() { console.log(i);

有人能向我解释一下(清楚而简洁)为什么这段代码是这样工作的吗?我来自Java(6和7)的强类型背景,在Java中闭包不存在,也不像javascript中那样工作。我认为与这个问题相关的概念是:闭包和范围链

下面是一个例子:

var myfuncs = function() {
    var funcs = []
    var i;
    for (i = 0; i < 10; i++) {
       funcs[i] = function() { console.log(i); }
    }
    return funcs;
}

var allfuncs = myfuncs();
allfuncs.forEach(function(fn) { fn(); });
var myfuncs=function(){
var funcs=[]
var i;
对于(i=0;i<10;i++){
funcs[i]=function(){console.log(i);}
}
返回函数;
}
var allfuncs=myfuncs();
forEach(函数(fn){fn();});
上面的例子记录了9次(10次),但是预期和我自己的直觉认为它会记录0-9次

为什么它会像Javascript中那样工作?闭包功能非常强大,但我正试图一劳永逸地掌握这个概念!一个稍加修改的示例生成正确的输出,但为什么

var myfuncs = function() {
    var funcs = []
    var i;
    for (i = 0; i < 10; i++) {
       funcs[i] = (function(index) { console.log(index); })(i);
    }
    return funcs;
}

var allfuncs = myfuncs();
allfuncs.forEach(function(fn) { fn(); }); 
var myfuncs=function(){
var funcs=[]
var i;
对于(i=0;i<10;i++){
funcs[i]=(函数(索引){console.log(索引);})(i);
}
返回函数;
}
var allfuncs=myfuncs();
forEach(函数(fn){fn();});
闭包并不是Javascript所独有的,但我想看看,在Javascript实际被编写为与浏览器/dom接口的情况下,闭包为何如此强大

有没有人有好的、实用的例子来说明我们在与浏览器/dom接口时如何应用闭包技术


谢谢。

在您的示例中,它非常简单

在第一个示例中,只有一个变量
i
,所有变量都引用该单个值。所以它将数字
9
打印十次。每个函数都捕获了一个共享值
i
,该值会发生变化

在第二个示例中,您使用的是闭包。每个函数都有一个名为
index
的私有变量,它接收值
i
副本,这是最重要的部分

因此,通过
9
可以得到
0
,因为有十个函数,每个函数都有一个私有的
索引
变量,每个
索引
变量都可以得到当时存在的
i
的快照。

这是一种较长的结束形式,可能有助于:

function myFactory(index) {
  return function() {
    console.log(index);
  }
}

var myfuncs = function() {
    var funcs = []
    var i;
    for (i = 0; i < 10; i++) {
       funcs[i] = myFactory(i);
    }
    return funcs;
}

var allfuncs = myfuncs();
allfuncs.forEach(function(fn) { fn(); }); 
函数myFactory(索引){
返回函数(){
控制台日志(索引);
}
}
var myfuncs=函数(){
var funcs=[]
var i;
对于(i=0;i<10;i++){
funcs[i]=我的工厂(i);
}
返回函数;
}
var allfuncs=myfuncs();
forEach(函数(fn){fn();});

它的可能副本非常简单:JavaScript只有函数作用域。即,每个闭包引用相同的变量
I
。变量是在函数被调用时计算的,而不是在函数被定义时。谢谢你的帮助!你的意思是“var myFactory(index)”而不是“var myFactory=function(index){…}”吗?实际上,我的意思是
function
。固定的。谢谢