函数中的javascript可选参数
我有一个典型的JavaScript函数与一些参数
my_function = function(content, options) { action }
如果我这样称呼这个function:
my_function (options)
参数“选项”作为“内容”传递
我怎么去绕过这个,所以我可以有两个参数通过或只有一个? 谢谢
你必须决定你想要处理一个参数的参数。 你不能把它当作两者, content
和options
。
我看到两种可能性:
- 要么改变你的参数的顺序,即
function(options, content)
-
检查
options
是否被定义:function(content, options) { if(typeof options === "undefined") { options = content; content = null; } //action }
但是,那么你必须正确的文件,如果你只传递一个参数到函数会发生什么,因为通过查看签名不会立即清除。
my_function = function(hash) { /* use hash.options and hash.content */ };
然后打电话给:
my_function ({ options: options }); my_function ({ options: options, content: content });
喜欢这个:
my_function (null, options) // for options only my_function (content) // for content only my_function (content, options) // for both
或者你也可以通过你得到什么types的内容来区分。 选项曾经是一个对象的内容是用来作为一个string,所以你可以说:
if ( typeof content === "object" ) { options = content; content = null; }
或者,如果您对重命名感到困惑,则可以使用可以更直接的参数数组:
if ( arguments.length === 1 ) { options = arguments[0]; content = null; }
有两种方法可以做到这一点。
1)
function something(options) { var timeToLive = options.timeToLive || 200; // default to 200 if not set ... }
2)
function something(timeToDie /*, timeToLive*/) { var timeToLive = arguments[1] || 200; // default to 200 if not set .. }
在1)中, options
是一个JS对象,具有什么属性是必需的。 这更容易维护和扩展。
在2)中,函数签名是清楚的,阅读和理解,可以提供第二个参数。 我已经看到了Mozilla代码和文档中使用的这种风格。
您可以将所有可选参数作为第一个parameter passing给对象。 第二个参数是你的callback。 现在,您可以在第一个参数对象中接受任意数量的参数,并使其成为可选参数:
function my_func(op, cb) { var options = (typeof arguments[0] !== "function")? arguments[0] : {}, callback = (typeof arguments[0] !== "function")? arguments[1] : arguments[0]; console.log(options); console.log(callback); }
如果你不通过options参数来调用它,它将默认为一个空对象:
my_func(function () {}); => options: {} => callback: function() {}
如果你用选项的参数来调用它,你会得到所有的参数:
my_func({param1: 'param1', param2: 'param2'}, function () {}); => options: {param1: "param1", param2: "param2"} => callback: function() {}
这显然可以调整比两个更多的争论,但它变得更混乱。 如果你只能使用一个对象作为你的第一个参数,那么你可以使用该对象传递无限量的参数。 如果你绝对需要更多的可选参数(例如my_func(arg1,arg2,arg3,…,arg10,fn)),那么我build议使用像ArgueJS这样的库。 我没有亲自使用它,但它看起来很有希望。
我创build了一个简单的库来处理JavaScript函数的可选参数,请参阅https://github.com/ovatto/argShim 。 该库是用Node.js开发的,但应该可以轻松移植到浏览器上。
例:
var argShim = require('argShim'); var defaultOptions = { myOption: 123 }; var my_function = argShim([ {optional:'String'}, {optional:'Object',default:defaultOptions} ], function(content, options) { console.log("content:", content, "options:", options); }); my_function(); my_function('str'); my_function({myOption:42}); my_function('str', {myOption:42});
输出:
content: undefined options: { myOption: 123 } content: str options: { myOption: 123 } content: undefined options: { myOption: 42 } content: str options: { myOption: 42 }
库的主要目标是模块接口,您需要能够处理导出模块函数的不同调用。
只是为了踢一个长长的死马,因为我必须在两个或更多的必要参数中间实施一个可选参数。 使用arguments
数组,并使用最后一个作为必需的非可选参数。
my_function() { var options = arguments[argument.length - 1]; var content = arguments.length > 1 ? arguments[0] : null; }
在MDN网站的 ES6中有一个很好的读取默认参数。
在ES6中,您现在可以执行以下操作:
secondDefaultValue = 'indirectSecondDefaultValue'; function MyObject( param1 = 'firstDefaultValue', param2 = secondDefaultValue ){ this.first = param1; this.second = param2; }
您也可以使用这个如下:
var object = new MyObject( undefined, options );
这将为第一个参数1和第二个参数2设置默认值'firstDefaultValue'
。
这里是一个小提琴演示
你会得到未定义的未传递的参数值。 但在你的情况下,你必须在第一个参数中至less传递null值。
或者你必须改变方法定义
my_function = function(options, content) { action }
像这样打电话
my_function ("", options);
你也可以把一个检查,如: options = !options ? content : options
options = !options ? content : options
如果没有第二个参数传入,选项会将options = !options ? content : options
设置为第一个参数,然后将内容设置为null(或者忽略它,但是要检查)