我想要一个带有id,可选属性参数和回调函数的函数'get'。它会像这样使用:
get(14297, 'name', function processName(name) {...});
get(14297, function processStudent(student) {...});
我在
中包含了一个可能的实现function get(id, property, callback) {
var item = ...;
// property is callback
if (!callback) property(item);
// callback is callback
else callback(item[property])
}
感觉有点奇怪,因为
property(item);
实际上是一个取决于上下文的回调函数。有更好的方法吗?
答案 0 :(得分:4)
您应该切换参数。试试这个
function get(id, callback, property)
{
if(typeof property === "undefined")
callback(item);
else
callback(item[property]);
}
答案 1 :(得分:2)
这是jQuery使用的模式:
function get(id, property, callback) {
// if the 2nd parameter is a function, assume that
// only two parameters were supplied
if (typeof property === 'function') {
callback = property;
property = undefined;
}
...
}
实际上,如果它看到意外的参数类型,它只是将它们的内容混洗,直到它们与替代定义匹配。
答案 2 :(得分:2)
您可以更改参数的顺序,或测试给出的功能以确定它们的含义。 e.g。
function get(id, property, callback) {
if (arguments.length == 2) {
// second argument is callback
callback = property;
property = void 0;
}
...
}
或
function get(id, property, callback) {
if (typeof property == 'function') {
// second argument is callback
callback = property;
property = void 0;
}
...
}
等等,但这种类型的重载并不是特别受欢迎。
答案 3 :(得分:0)
arguments
对象是不可变的。但是你可以在数组中对它进行切片,弹出最后一个参数并像往常一样处理其他参数,因为你知道callback
参数不再存在了。
这是一种方法:
function get() {
// Copy the `arguments` object in an array, since it's immutable
var args = Array.prototype.slice.call( arguments, 1 ),
// Pop the last argument of the arguments
callback = args.pop();
// Then deal with other arguments
// For example, check for the existence of the second argument
if ( args[1] ) {
}
// Then, you can call the callback function
callback();
}