3

我正在比较在 Knockout.js中使用计算的 observable 函数的两种方法

问题:

  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
        };
    
4

1 回答 1

2

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

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

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

于 2013-07-12T06:16:05.930 回答