Javascript 如何将变量保持在范围内
我有一个关联的对象数组,我想用一些函数扩展它。 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();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
作用域将更改为调用对象-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的解决方案在这种特殊情况下更好,但这更普遍适用。