所以我使用一个对象传递我的可选变量,如下所示:
var foo = function (options) {
var options = options || {}; //provide a default, so that
var bar = options.bar || 42; //this doesn't fail on 'foo();'
//do stuff
};
Run Code Online (Sandbox Code Playgroud)
JSLint抱怨我正在覆盖选项,如果它是假的,这就是我想要的.实际上,我应该检查它是否是一个对象,否则抛出错误让用户知道是什么.所以 - 在那个注意事项 - 这里有什么好的形式?有人对此有一个很好的解读吗?另外,我将如何以DRY风格编写一系列具有此模式的函数?
首先,您不需要将options参数重新分配给var.其次,对于某些值要小心:
var foo = function (options) {
options = options || {};
var bar = options.bar || 42;
var baz = options.baz || 'fubar';
};
foo({ bar: 0, baz: "" });
Run Code Online (Sandbox Code Playgroud)
里面foo,bar == 42和baz == 'fubar'因为0和""是falsy.为了更精确,更加冗长可能更好:
var foo = function (options) {
options = options || {};
var bar = typeof options.bar == 'undefined' ? 42 : options.bar;
var baz = typeof options.baz == 'undefined' ? 'fubar' : options.baz;
};
Run Code Online (Sandbox Code Playgroud)
但是,要成为DRY,您可以创建一个defaults对象,并将两个对象扩展到一个settings对象:
// generic shallow object extension, mutates obj1
var extend = function (obj1, obj2) {
for (var prop in obj2) {
if (obj2.hasOwnProperty(prop)) {
obj1[prop] = obj2[prop];
}
}
return obj1;
};
var foo = function (options) {
var defaults = {
bar: 42,
baz: 'fubar'
},
settings = extend(defaults, options);
};
Run Code Online (Sandbox Code Playgroud)
由于您不会defaults在此调用中再使用它,因此它会发生变异并不重要.使用此方法:
foo(); // -> settings = { bar: 42, baz: 'fubar' }
foo({ bar: 0 }); // -> settings = { bar: 0, baz: 'fubar' }
foo({ bar: 0, baz: "" }); // -> settings = { bar: 0, baz: '' }
Run Code Online (Sandbox Code Playgroud)