Knockout.js中计算的可观察函数的数据上下文

时间:2013-07-12 03:23:59

标签: javascript knockout.js

我在Knockout.js中比较两种使用计算的可观察函数的方法

问题:

  1. 函数中的“this”关键字是指它的父对象(外部,而不是函数内部)?
  2. 为什么版本2即使没有将上下文值放在最后也可以工作?

        ///Version 1
        my.Product = function () {
            this.id = ko.observable();
            this.salePrice = ko.observable();
            this.photo = ko.observable();
            this.shortDescription = ko.observable();
            this.photoUrl = ko.computed
            (function () {
                return photoPath + this.photo();
            },this);  //**context**
        };
    
        ////version 2
        my.Product = function () {
            var self = this;
            self.id = ko.observable();
            self.salePrice = ko.observable();
            self.photo = ko.observable();
            self.shortDescription = ko.observable();
            self.photoUrl = ko.computed(function () {
                return photoPath + self.photo();
            });//why there is no "self" here
        };
    

1 个答案:

答案 0 :(得分:2)

我不确定我理解你的第一个问题。在第一种情况下,您传递“this”以便能够在计算函数中将“this”称为“this”。它特定于淘汰赛,但淘汰赛可能会使用callapply。两者都允许重新定义“这个”。 如果你没有传递“this”作为第二个参数“this”将引用计算的函数范围。而且这张照片将是未定义的。

第二种情况是常见的javascript“技巧”。它包括将“this”赋给变量以便能够在另一个范围内引用它。您不必将“self”作为参数传递,因为它是一个变量,可以从函数中访问。

这两个例子都有效。我个人更喜欢第二种,因为它是处理javascript执行上下文的一种更常用的方式。