通过带有参数的函数作为参数?


151

是否可以通过以参数作为参数的javascript函数?

例:

$(edit_link).click( changeViewMode( myvar ) );

5
看起来像JQuery,很可能是这样,但这无关紧要。无论使用什么Javascript库,用法或参数和功能都是相同的。
加法

@Guffa-我想知道是否应该使用jQuery标记
Russ Cam

1
@Lucia请考虑更改对此可接受的答案。
米哈尔Perłakowski

如果你正在与之反应,可考虑stackoverflow.com/questions/41369497/...
迈克尔Freidgeim

Answers:


244

使用“关闭”:

$(edit_link).click(function(){ return changeViewMode(myvar); });

这将创建一个匿名的临时函数包装器,该包装器了解该参数并将其传递给实际的回调实现。


3
如果要在对象上调用函数,则需要调用bind()。myObj.click(function(){this.doSomething();} .bind(myObj)); 这将使“ this”成为myObj。
伊莱2013年

1
处理许多此类问题时,这不是性能问题吗?例如,您要连续渲染onPress,并且有10,000行。这将为每个行创建一个新的匿名临时函数包装。还有其他方法吗?
Joshua Pinter

@JoshuaPinter该技术本身不是问题。如果您需要10,000次相同的函数调用,则只需将包装器保存在一个变量中,因此只需创建一次即可。如果您需要传递10,000个不同的上下文,那么您几乎无能为力。提防过早的优化:与性能一样,您需要进行度量以查看是否存在问题。当今的JavaScript引擎非常强大,并且可能以令人惊讶的方式优化代码。
Ferdinand Beyer

@FerdinandBeyer太好了,谢谢你的提示。一位朋友告诉我这是不好的做法,您应该改用this.myFunction = this.myFunction.bind(this)您的constructor方法。但是,就像您说的那样,当您必须为每个传递不同的上下文时,就像您单击以打开该行的详细信息页面的所有不同行一样,这是不可避免的。
Joshua Pinter

@FerdinandBeyer,可以说myvar是一个字符串,并且在两次连续调用之间将changeViewMode作为一个闭包进行了更改,但是changeViewMode始终接收myvar的第一个值,我想使用将不同参数值分配给同一myvar变量的闭包函数来调用
nmxprime19年

42

使用Function.prototype.bind()。报价MDN:

bind()方法创建一个新函数,该新函数在被调用时将其this关键字设置为提供的值,并在调用新函数时提供给定的参数序列。

所有主要浏览器(包括IE9 +)都支持它。

您的代码应如下所示:

$(edit_link).click(changeViewMode.bind(null, myvar));

旁注:我假设您处于全局环境中,即this变量is window; 否则使用this代替null


谢谢,这对我有帮助。像这样使用它:$.ajax(url).done(handler.bind(this, var1, var2));
Thomas

2
哪个选项最佳?使用闭包还是使用bind函数?请让我知道是否有任何性能影响
Varun的


15

不,但是您可以传递不带参数的参数,然后执行以下操作:

$(edit_link).click(
  function() { changeViewMode(myvar); }
);

因此,您要传递不带参数的匿名函数,然后该函数使用闭包中的变量调用参数化函数




2

你可以这样做

var message  = 'Hello World';

var callback = function(){
alert(this)
}.bind(message);

然后

function activate(callback){
  callback && callback();
}

activate(callback);

或者,如果您的回调包含更灵活的逻辑,则可以传递对象。

演示版


2

这是费迪南德·拜耶(Ferdinand Beyer)方法的一个示例:

function function1()
{
    function2(function () { function3("parameter value"); });
}
function function2(functionToBindOnClick)
{
    $(".myButton").click(functionToBindOnClick);
}
function function3(message) { alert(message); }

在此示例中,使用函数包装将“参数值”从函数1通过函数2传递到函数3。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.