Javascript 功能范围与AngularJS手表混乱

Javascript 功能范围与AngularJS手表混乱,javascript,angularjs,angularjs-scope,angularjs-watch,Javascript,Angularjs,Angularjs Scope,Angularjs Watch,我目前的情况是,我需要根据对象的属性创建一些手表 这些属性用于对依赖于同一变量/表达式的函数进行分组 在循环中创建$watch函数时,这似乎很好,但是当watch实际执行时,只有最后一个属性被持久化到函数范围中。这意味着对于所有的$watchs(计算不同的表达式),执行的函数是相同的 for (var prop in obj) { if (obj.hasOwnProperty(prop) { $scope.$watch(function() {

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

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

在循环中创建$watch函数时,这似乎很好,但是当watch实际执行时,只有最后一个属性被持久化到函数范围中。这意味着对于所有的$watchs(计算不同的表达式),执行的函数是相同的

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: [...]
    }
};
然后调用函数evaluatedPendenExpressions两次,其中prop的值为'Person.Age'

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


这是JavaScript中已知的问题
prop
变量在
中设置为上次使用的值(obj中的var prop)
,简单的解决方法是使用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中已知的问题
prop
变量在
中设置为上次使用的值(obj中的var prop)
,简单的解决方法是使用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);
}
解释如下: