传递带有参数的函数作为参数?

Posted

技术标签:

【中文标题】传递带有参数的函数作为参数?【英文标题】:Passing a function with parameters as a parameter? 【发布时间】:2017-04-28 11:06:31 【问题描述】:

是否可以将带有参数的javascript函数作为参数传递?

例子:

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

【问题讨论】:

它看起来像 JQuery,而且很可能是,但这无关紧要。不管你使用什么 Javascript 库,使用或参数和功能都是一样的。 如果您正在使用 React,请考虑 ***.com/questions/41369497/… 【参考方案1】:

使用“闭包”:

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

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

【讨论】:

如果你想在一个对象上调用一个函数,你需要调用bind()。 myObj.click(function()this.doSomething();.bind(myObj));这将使“this”成为 myObj。 在处理大量此类问题时,这不是性能问题吗?例如。您正在连续渲染一个 onPress,并且您有 10,000 行。这将为每一行创建一个新的匿名临时函数包装器。还有其他方法吗? @JoshuaPinter 技术本身不是问题。如果您需要 10,000 次相同的函数调用,您可以简单地将包装器保存在一个变量中,这样您只需创建一次。如果您需要传递 10,000 个不同的上下文,那么您无能为力。提防过早的优化:与性能一样,您需要测量以查看是否存在问题。今天的 JavaScript 引擎非常强大,可能会以惊人的方式优化代码。 @FerdinandBeyer 太棒了,感谢您的提示。一位朋友告诉我这是不好的做法,您应该在 constructor 方法中改用 this.myFunction = this.myFunction.bind(this)。但是,就像您说的那样,当您必须为每个行传递不同的上下文时,例如您单击以打开该行的详细信息页面的所有不同行,这是无法避免的。 @FerdinandBeyer ,假设 myvar 是一个字符串,它在两次连续调用 changeViewMode 作为闭包时发生了变化,但是 changeViewMode 总是接收 myvar 的第一个值,我想用不同的参数调用闭包函数分配给同一个 myvar 变量的值,【参考方案2】:

是的,像这样:

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

【讨论】:

【参考方案3】:

不,但你可以不带参数传递一个,然后这样做:

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

所以你传递了一个不带参数的匿名函数,然后该函数使用闭包中的变量调用你的参数化函数

【讨论】:

【参考方案4】:

使用Function.prototype.bind()。引用 MDN:

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

所有主流浏览器都支持,包括IE9+。

您的代码应如下所示:

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

旁注:我假设您在全局上下文中,即this 变量是window;否则使用this 而不是null

【讨论】:

谢谢,这对我有帮助。像这样使用它:$.ajax(url).done(handler.bind(this, var1, var2)); 哪个选项最好?使用闭包还是使用绑定函数?如果有任何性能影响,请告诉我 @Varun 见Why is bind slower than a closure?【参考方案5】:

你可以这样做

var message  = 'Hello World';

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

然后

function activate(callback)
  callback && callback();


activate(callback);

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

Demo

【讨论】:

【参考方案6】:

这是一个遵循 Ferdinand Beyer 方法的示例:

function function1()

    function2(function ()  function3("parameter value"); );

function function2(functionToBindOnClick)

    $(".myButton").click(functionToBindOnClick);

function function3(message)  alert(message); 

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

【讨论】:

【参考方案7】:

或者如果你使用的是 es6,你应该可以使用箭头函数

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

【讨论】:

以上是关于传递带有参数的函数作为参数?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript函数的模板,带有作为对象传递的可选和必需参数

如何将带有 args 的成员函数作为参数传递给另一个成员函数?

指向具有多个参数作为函数参数的函数的指针

将“void”作为函数参数传递

golang-101-hacks(12)——切片作为函数参数传递

将数组动态分配到带有指针参数的函数中