$scope与this的性能比较

6

在这个问题中,this vs $scope 的区别已经被清楚地解答了。我正在参与的一个项目中,我们的高级开发人员正在推广使用 this,并声称它提供更好的性能。

我试图找到任何支持这种说法的证据,但官方的 Angular 文档在这个问题上提供的信息非常有限。

请问:

  1. 相比于 $scopethis 是否提供更好的性能(假设我不使用 $watch 等)?
  2. 如果是,具体原因是什么?性能提升是否足够显著,可以让现有使用 $scope 的应用程序转换为 this

可能是AngularJS控制器中this与$scope的区别的重复问题。 - Roy M J
请仔细阅读问题,我不是在要求您推迟,我在询问其他事项。 - Yogesh
4
好的,我会尽力为您提供准确的翻译。以下是需要翻译的内容:请参考此链接:https://github.com/johnpapa/angular-styleguide - Tarun Dugar
从风格上讲,最好使用this而不是$scope,因为这样当您使用$watch或类似功能时,它会提醒您该控制器出于某种原因接受了$scope,否则您往往会忽略它的存在。此外,如果可用,人们倾向于使用诸如$scope.$apply之类的东西-如果不可用,他们会找到“更好”的方法。在性能方面,可能没有任何好处。 - Kyle Muir
我不确定性能如何,但$scope明显是对本地this的一种语法糖。现在Angular团队正在推广使用this而非$scope的控制器。真正的好处是当你从angular 1.*迁移到2.0时。 其他好处包括将控制器与框架解耦,这样您就可以在Angular上下文之外测试控制器。 - Abhishek Prakash
3个回答

5

AngularJS的性能受当前加载视图(页面)使用的绑定数量和您使用$watch手动设置的观察器的影响。

所有这些绑定只适用于在$scope上声明的属性。

这意味着,如果您不将属性绑定到视图或不监视它,则最好不要在$scope上声明它(也称避免污染$scope)。

关于this,如SO帖子中所解释的那样,当Angular调用它时(例如在ng-click的情况下),它具有不同的上下文,并且当控制器创建时也是如此。

因此,您在控制器中声明的任何内容(当引用控制器时)在技术上都无法绑定到视图,因为它没有在作用域上声明。

但是,Angular提出了一个controller as语法,使我们可以在控制器对象上使用属性和方法。在这种情况下,通过ctrl.prop语法将控制器中声明的属性绑定到视图。

当您执行ng-controller='HomeController as ctrl'时,Angular内部会执行以下操作:

$scope.ctrl=this

这基本上意味着Angular将完整的控制器对象附加到$scope上,因此与控制器属性的绑定有效。

因此,在性能方面唯一重要的是被观察的绑定数量。


简而言之,this$scope之间没有性能优势! - Yogesh
如前所述,性能是由视图中绑定的数量定义的,而不是直接由 this$scope 定义的。如果您在作用域上定义了许多属性却从未使用它们,则不会影响性能。 - Chandermani
2
在这种情况下,使用$scope而不是this会更好吗?如果我理解正确,如果“控制器”语法将整个“this”公开到$scope中,那么与我们仅在需要时在控制器中声明$scope的方法相比,是否会导致更多的$scope污染? - Neel

0

AngularJS可以互换使用它们,因此在性能方面没有区别。

但是,与$scope相比,使用this应该会降低一些性能(甚至不会降低太多),因为this会创建一个新的对象实例。

但是,实际上使用this更加优雅,因为:

  • 更具上下文意义(例如items.name而不是name)
  • 可以轻松地在嵌套控制器中使用,而不会产生任何冲突。

0

假设您没有手表,它不应该创建性能障碍。

在我看来,您的controller上不应该有任何"this"方法或属性。
controller是视图的好朋友,应该只有相关的属性。
相关属性是您将在视图中绑定的属性(属性、函数等)。

所有"this"属性都应该放在一个service中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接