【问题标题】:how does angular search for variable through its $scope chain角度如何通过其 $scope 链搜索变量
【发布时间】:2013-10-07 17:21:09
【问题描述】:
(function(){
  var outer = 'foo';
  (function(){
    var inner = 'bar';
    return [inner, outer];
  })();
})();

上面的代码创建了一个缓慢的分辨率,因为内部函数#outer 需要首先检查最近的对象并查看它不包含'outer',然后在下一级作用域链中查找变量。

以下角度代码的行为方式是否完全相同?如果是这样,那么我们应该注意范围创建和范围链变量查找吗?

angular.module('app', [], function($rootScope){
    $rootScope.rootVar = 'root Variable';
})
.controller('ctrl1', function($scope){
    $scope.var1 = rootVar;
})
.controller('ctrl2', function($scope){ //nested
    $scope.var2 = rootVar;
})

【问题讨论】:

  • 在您的示例中,rootVar 不应作为独立变量使用,只能作为 $scope 上的属性使用

标签: javascript angularjs optimization scope


【解决方案1】:

在 Angular 中,您不会以相同的方式创建内部范围,而是传递一个包含“范围”的变量。所以你不能只引用rootVar,它在当前函数范围内不存在,除了作为你传入的$scope上的属性。所以你需要改变你对

的引用
angular.module('app', [], function($rootScope){
    $rootScope.rootVar = 'root Variable';
})
.controller('ctrl1', function($scope){
    $scope.var1 = $scope.rootVar;
})
.controller('ctrl2', function($scope){ //nested
    $scope.var2 = $scope.rootVar;
})

【讨论】:

  • 对,错字,但你知道搜索迭代器是如何开始的吗?性能有多差?
  • 我不确定你到底在问什么。这些调用不会迭代。他们寻找一个名为 $scope 的变量。他们在本地范围内找到了一个,然后将停止查找。他们会从中读取属性 rootVar。不会对性能产生影响。
  • 不,如果它们不在本地范围内,它们会提升范围并尝试查看 $scope.$parent.rootVar,如果仍然没有返回匹配项,则查找 $ scope.$parent.$parent,最终你会得到 $rootScope,它什么都不返回,然后它会将它设置为 undefined。那么在这个过程中,性能是否受到很大影响?
  • 不,它的作用是查看当前 $scope 的原型。如果它不在对象或其原​​型链上,则它不存在。查找原型链不会对性能造成重大影响。
  • 谢谢,所以 $scope 的原型指向它的 $parent 属性作为参考。
猜你喜欢
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 2013-03-17
相关资源
最近更新 更多