Javascript 如何将变量保持在范围内

Javascript 如何将变量保持在范围内,javascript,scope,closures,Javascript,Scope,Closures,我有一个关联的对象数组,我想用一些函数扩展它。 myCtrls//对象数组 我通过下面的循环来实现这一点 $(document).ready(function() { for (ctrlName in fieldCtrls){ var ctrl = fieldCtrls[ctrlName]; ctrl.Initialize = function(){ //Do some stuff ctrl.somePro

我有一个关联的对象数组,我想用一些函数扩展它。 myCtrls//对象数组

我通过下面的循环来实现这一点

$(document).ready(function() { for (ctrlName in fieldCtrls){ var ctrl = fieldCtrls[ctrlName]; ctrl.Initialize = function(){ //Do some stuff ctrl.someProperty = "newValue"; } ctrl.Validate= function(){ //Do some more stuff ctrl.someProperty = "validation ok"; } } 后来,我执行了这样一个函数。但是,变量“ctrl”现在总是指向“fieldCtrls”中的最后一个对象。如何使变量“ctrl”在“initialize”和“Validate”中工作

fieldCtrls['id'].Validate();
作用域将更改为调用对象-fieldCtrls['id']。因此,您应该能够使用它访问内部属性

ctrl.Validate= function(){
  //Do some more stuff
  this.someProperty = "validation ok";
}

作用域将更改为调用对象-fieldCtrls['id']。因此,您应该能够使用它访问内部属性

ctrl.Validate= function(){
  //Do some more stuff
  this.someProperty = "validation ok";
}
描述您看到的问题。var-ctrl声明实际上被解释为函数本地,而不是循环本地

您可以通过编写以下内容来解决此问题:

$(document).ready(function() {
    for (ctrlName in fieldCtrls){
        function(ctrl) { // create a new anonymous function ...
            ctrl.Initialize = function(){
                //Do some stuff
                ctrl.someProperty = "newValue";
            }
            ctrl.Validate= function(){
                //Do some more stuff
                ctrl.someProperty = "validation ok";
            }
        }(fieldCtrls[ctrlName]); // ... and call the function right away
    }
}
这就为每个循环迭代强制了一个新的ctrl范围,因此每个函数捕获一个不同的变量,而不是每次都捕获一个相同的变量

N.B.未经测试,我不是JavaScript大师。然而,这个问题困扰着大多数支持闭包的脚本语言。

描述了您看到的问题。var-ctrl声明实际上被解释为函数本地,而不是循环本地

您可以通过编写以下内容来解决此问题:

$(document).ready(function() {
    for (ctrlName in fieldCtrls){
        function(ctrl) { // create a new anonymous function ...
            ctrl.Initialize = function(){
                //Do some stuff
                ctrl.someProperty = "newValue";
            }
            ctrl.Validate= function(){
                //Do some more stuff
                ctrl.someProperty = "validation ok";
            }
        }(fieldCtrls[ctrlName]); // ... and call the function right away
    }
}
这就为每个循环迭代强制了一个新的ctrl范围,因此每个函数捕获一个不同的变量,而不是每次都捕获一个相同的变量


N.B.未经测试,我不是JavaScript大师。然而,这个问题困扰着大多数支持闭包的脚本语言。

啊,我为什么不考虑呢;啊,为什么我不知道呢;非常感谢。你设法向我解释了闭包!我读了很多关于它的书,但还没有领会。哇,我甚至没有真正尝试过。我想我应该发布这个,尽管Ivar的解决方案在这种情况下更好,但这更普遍适用。谢谢!你设法向我解释了闭包!我读了很多关于它的书,但还没有领会。哇,我甚至没有真正尝试过。我想我应该发布这个,尽管Ivar的解决方案在这种特殊情况下更好,但这更普遍适用。