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提供给消费代码/开发人员调用函数是什么?
答案 0 :(得分:5)
在您发布的链接中,作者声明
当ko.toJS运行时,它只会看到一个普通函数并忽略它。
换句话说,他正在使用这样一个事实,即他正在使用的框架将忽略他正在使用它的上下文中的函数,而如果他使用了一个对象,框架就不会忽略它。
他从不打算调用这个函数,只是将它用作存放脏标志的地方,同时欺骗淘汰框架忽略它。
答案 1 :(得分:1)
这只是创建一个对象的另一种方式,我不相信以这种或那种方式做到这一点有任何不同。有时只是一种风格偏好,有时只是程序员喜欢做某事的方式。 (就像使用var = this,或使用函数的bind方法。既合法又通过上下文的两种方式)。
以下是creating objects in JavaScript from MDN
上的详细信息创建对象并在JavaScript中声明一个空函数是创建对象的方法。在JavaScript中,事物是对象,有许多方法可以创建它们。没有一种方法比另一方好得多。尽管从ECMAScript5开始,最好的方法是使用Object.create。