42

computedKnockoutJS和KnockoutJS有什么区别pureComputed

我可以使用pureComputed而不是computed安全吗?

4

2 回答 2

31

它们非常相似。不同之处在于pureComputed进行了一些性能优化,并试图通过聪明地了解谁在跟踪其更改来防止内存泄漏。

在很多情况下,您可以安全地替换computed为。pureComputed计算内部的函数应遵循以下内容:

1. 评估计算出的 observable 不应引起任何副作用。

2. 计算出的 observable 的值不应根据评估次数或其他“隐藏”信息而变化。它的值应仅基于应用程序中其他可观察对象的值,对于纯函数定义,这些值被视为其参数。

所以作为一个经验法则,任何计算的 observable 只是简单地转换一些常规observable属性应该可以作为 a pureComputed,否则坚持使用computed.

该文档对何时/为什么不应该使用observablespureComputed有很好的解释。这是一个相关的摘录:

您不应该将纯功能用于计算的可观察对象,该可观察对象旨在在其依赖关系发生变化时执行操作。

如果评估器具有重要的副作用,则不应使用纯计算的原因很简单,只要计算器没有活动订阅者(睡眠也是如此),评估器就不会运行。如果评估器在依赖关系发生变化时始终运行很重要,请改用常规计算。

于 2015-05-19T06:05:58.150 回答
23

我同意@Jeroen 的观点,我想从 J. Munro 的书中添加一个简短的例子,这对我有很大帮助,所以这可能对其他人也有帮助。

首先,pureComputed observables 与计算后的 observables 非常相似,但在性能和内存方面有一些改进。这个名字是从纯函数编程术语借来的,它意味着任何只使用局部变量的函数都是潜在的纯函数,而任何使用非局部变量的函数都可能是不纯的。

Knockout.js 中的 observables 被区别对待。因此,pureComputed observables 被置于睡眠模式(Knockout 倾斜所有依赖项并在读取后重新评估内容),并且计算出的 observables 被置于监听模式(Knockout 在第一次访问之前不断检查值是否是最新的) .

因此,如果您需要执行其他代码,那么最好使用计算的 observables。

function ViewModel() {
     var self = this;

     self.firstName = ko.observable('Arshile');
     self.lastName = ko.observable('Gorky');
     self.pureComputedExecutions = 0;
     self.computedExecutions = 0;

     self.pureComputedFullName = ko.pureComputed(function() {
         // This is NOT recommended 
         self.pureComputedExecutions++;
         return 'Hello ' + self.firstName() + ' ' + self.lastName();
     });
     self.computedFullName = ko.computed(function() {
         self.computedExecutions++;

         return 'Hello ' + self.firstName() + ' ' + self.lastName();
     });
 };
 var viewModel = new ViewModel();
 ko.applyBindings(viewModel);

 alert('Pure computed executions: ' + viewModel.pureComputedExecutions);
 alert('Computed executions: ' + viewModel.computedExecutions);

运行此代码时,会显示两条警报消息,显示调用 pureComputed 和 computed 函数的次数。由于 pureComputed 处于睡眠模式,因此从未访问过该函数,计数器将显示 0。与此相反,计算函数在数据绑定时自动评估,导致计数器增加数字并显示 1。

于 2015-07-31T14:15:30.937 回答