JavaScript:如何将多个参数传递给对象成员中的回调函数?

时间:2013-06-03 13:50:10

标签: javascript jquery jquery-plugins

使用插件时,我偶尔偶然发现一个有这样的插件:

  • 它将采用构造函数参数。
  • 某些参数解析为函数。
  • 其中一些将采取多种争论。
像这样:

{
    color: function (someData, moreData) {
        return someData + moreData;
    }
}

如何将两个参数传递给该函数?

注意:我无法更改插件,因此将第二个参数移动到另一个构造函数参数不是一个选项。

示例JavaScript:

(function ($) {
    $.fn.greenify = function (options) {
        var settings = $.extend({
            color: function (someData, moreData) { // <-- THIS TAKES 2 ARGUMENTS!
                return someData + moreData;
            },
        }, options);
        return this.css({
            color: settings.color,
        });
    };
}(jQuery));

$("#target1").greenify({
    color: "blue"
});

$("#target2").greenify({
    color: ["bl", "ue"]   // <-- In your answer only this should be changed
});

我的目标:

<div id="target1">My Thing</div>   // <-- will be blue
<div id="target2">My Thing2</div>  // <-- will be black but should be blue

FIDDLE DEMO


更新 我对这段代码的一个重大误解感到沮丧

$("#target1").greenify({
    color: "blue"
});

会将值"blue"移交给function (someData, moreData)作为第一个参数someData 这是假的! 实际发生的是默认回调(function (someData, moreData))完全被字符串"blue"取代!

3 个答案:

答案 0 :(得分:3)

  

如何将两个参数传递给该函数?

你没有。 jQuery呢。这是一个回调函数,用于在color方法中动态确定.css()属性 - 请参阅the docs

实际上,默认函数没有任何意义,因为它应该返回一个css颜色值,但返回以元素索引为前缀的旧值 - 这绝对不是一种颜色。

所以只需使用$("#target2").greenify({color: "black"})

如果你想传递一个函数,那也是可能的 - 但它会覆盖,而不是调用那个默认函数。一个例子:

$("div").greenify({
    color: function(index, prevColor) {
        return ["blue", "black"][index % 2];
    }
});

答案 1 :(得分:0)

var settings = $.extend({}, options);
if($.isArray(options.color)) {
    settings.color = function () {
        return options.color.join('');
    };
}

小提琴:http://jsfiddle.net/2QBGm/

答案 2 :(得分:0)

请参阅此jsFiddle

我对您的代码进行了一些更改,现在可以按照您的需要进行操作。

我使用options对象来获取参数:

color: function () {
    return options.color[0] + options.color[1];
}