功能范围与 AngularJS 手表混淆
Function scope messes with AngularJS Watches
我目前处于需要根据对象的属性创建一些手表的情况。
这些属性用于对依赖于相同变量/表达式的函数进行分组。
在循环中创建 $watch 函数时,看起来很好,但是当 watch 实际执行时,只有最后一个 属性 保留在函数范围内。这意味着对于所有 $watches(计算不同的表达式),执行的函数是相同的。
for (var prop in obj) {
if (obj.hasOwnProperty(prop) {
$scope.$watch(function() {
return evaluateExpression(obj[prop].expression);
}, function(newVal, oldVal) {
evaluateDependentExpressions(obj[prop].dependentExpressions);
});
}
}
现在,如果我的 obj 变量如下所示:
var obj = {
'Person.Name': {
expression: ...,
dependentExpressions: [...]
},
'Person.Age': {
expression: ...,
dependentExpressions: [...]
}
};
然后函数 evaluateDependentExpressions 被调用两次,其中 prop = 'Person.Age'.
非常感谢任何解决函数作用域问题的帮助。
这是 JavaScript 中的已知问题 prop
变量设置为 for (var prop in obj)
中最后使用的值,简单的解决方法是使用 IIFE:
for (var p in obj) {
(function(prop) {
// your code
if (obj.hasOwnProperty(prop) {
$scope.$watch(function() {
return evaluateExpression(obj[prop].expression);
}, function(newVal, oldVal) {
evaluateDependentExpressions(obj[prop].dependentExpressions);
});
}
})(p);
}
此处说明:JavaScript closure inside loops – simple practical example
我目前处于需要根据对象的属性创建一些手表的情况。
这些属性用于对依赖于相同变量/表达式的函数进行分组。
在循环中创建 $watch 函数时,看起来很好,但是当 watch 实际执行时,只有最后一个 属性 保留在函数范围内。这意味着对于所有 $watches(计算不同的表达式),执行的函数是相同的。
for (var prop in obj) {
if (obj.hasOwnProperty(prop) {
$scope.$watch(function() {
return evaluateExpression(obj[prop].expression);
}, function(newVal, oldVal) {
evaluateDependentExpressions(obj[prop].dependentExpressions);
});
}
}
现在,如果我的 obj 变量如下所示:
var obj = {
'Person.Name': {
expression: ...,
dependentExpressions: [...]
},
'Person.Age': {
expression: ...,
dependentExpressions: [...]
}
};
然后函数 evaluateDependentExpressions 被调用两次,其中 prop = 'Person.Age'.
非常感谢任何解决函数作用域问题的帮助。
这是 JavaScript 中的已知问题 prop
变量设置为 for (var prop in obj)
中最后使用的值,简单的解决方法是使用 IIFE:
for (var p in obj) {
(function(prop) {
// your code
if (obj.hasOwnProperty(prop) {
$scope.$watch(function() {
return evaluateExpression(obj[prop].expression);
}, function(newVal, oldVal) {
evaluateDependentExpressions(obj[prop].dependentExpressions);
});
}
})(p);
}
此处说明:JavaScript closure inside loops – simple practical example