为什么声明空的javascript函数然后添加属性

时间:2015-05-28 10:48:30

标签: javascript

ryan niemeyer在this blog bost上的代码声明了一个空函数(命名结果),然后向函数添加属性:

ko.dirtyFlag = function(root, isInitiallyDirty) {
    var result = function() {},
        _initialState = ko.observable(ko.toJSON(root)),
        _isInitiallyDirty = ko.observable(isInitiallyDirty);

    result.isDirty = ko.computed(function() {
        return _isInitiallyDirty() || _initialState() !== ko.toJSON(root);
    });

    result.reset = function() {
        _initialState(ko.toJSON(root));
        _isInitiallyDirty(false);
    };

    return result;
}; 

在返回对象之前,这有什么优势可以简单地创建一个对象并分配相同的属性?

修改

回应评论,询问我的期望: 要么宣布

var result={};

在声明中,或作为一种风格的东西:

ko.dirtyFlag = function(root, isInitiallyDirty) {
    var _initialState = ko.observable(ko.toJSON(root)),
        _isInitiallyDirty = ko.observable(isInitiallyDirty);
    return {
      isDirty : ko.computed(function() {
        return _isInitiallyDirty() || _initialState() !== ko.toJSON(root);
      }),
      reset : function() {
        _initialState(ko.toJSON(root));
        _isInitiallyDirty(false);
      }
   };
}; 

但是语义是无关紧要的 - 函数的shell提供给消费代码/开发人员调用函数是什么?

2 个答案:

答案 0 :(得分:5)

在您发布的链接中,作者声明

  

当ko.toJS运行时,它只会看到一个普通函数并忽略它。

换句话说,他正在使用这样一个事实,即他正在使用的框架将忽略他正在使用它的上下文中的函数,而如果他使用了一个对象,框架就不会忽略它。

他从不打算调用这个函数,只是将它用作存放脏标志的地方,同时欺骗淘汰框架忽略它。

答案 1 :(得分:1)

这只是创建一个对象的另一种方式,我不相信以这种或那种方式做到这一点有任何不同。有时只是一种风格偏好,有时只是程序员喜欢做某事的方式。 (就像使用var = this,或使用函数的bind方法。既合法又通过上下文的两种方式)。

以下是creating objects in JavaScript from MDN

上的详细信息

创建对象并在JavaScript中声明一个空函数是创建对象的方法。在JavaScript中,事物是对象,有许多方法可以创建它们。没有一种方法比另一方好得多。尽管从ECMAScript5开始,最好的方法是使用Object.create。