0

我目前处于需要根据对象的属性创建一些手表的情况。

这些属性用于对依赖于相同变量/表达式的函数进行分组。

在循环中创建 $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' 的值处被调用两次。

非常感谢如何解决功能范围问题的任何帮助。

笨拙

4

1 回答 1

2

这是 JavaScriptprop变量设置为最后使用的值的已知问题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 闭包 - 简单实用的示例

于 2016-06-09T10:35:57.033 回答