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

Luc*_*cia 132 javascript

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

例:

$(edit_link).click( changeViewMode( myvar ) );
Run Code Online (Sandbox Code Playgroud)

Fer*_*yer 226

使用"闭包":

$(edit_link).click(function(){ return changeViewMode(myvar); });
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您想要调用对象上的函数,则需要调用bind().myObj.click(function(){this.doSomething();} .bind(myObj)); 这将使"这个"成为myObj. (3认同)
  • @JoshuaPinter 技术本身不是问题。如果您需要 10,000 次相同的函数调用,您可以简单地将包装器保存在一个变量中,因此您只需创建一次。如果您需要传递 10,000 个不同的上下文,您几乎无能为力。当心过早优化:与性能一样,您需要*测量*以查看是否存在问题。今天的 JavaScript 引擎非常强大,可能会以惊人的方式优化代码。 (2认同)

Mic*_*ski 35

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

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

它受到所有主流浏览器的支持,包括IE9 +.

您的代码应如下所示:

$(edit_link).click(changeViewMode.bind(null, myvar));
Run Code Online (Sandbox Code Playgroud)

旁注:我假设你处于全局环境中,即this变量是window; 否则使用this而不是null.

  • @Varun请参阅[为什么绑定比关闭慢?](http://stackoverflow.com/questions/17638305/why-is-bind-slower-than-a-closure) (3认同)
  • 哪个选项最好?使用闭包还是使用绑定函数?请让我知道是否有任何性能影响 (2认同)

Cly*_*yde 15

不,但你可以传递一个没有参数,并执行此操作:

$(edit_link).click(
  function() { changeViewMode(myvar); }
);
Run Code Online (Sandbox Code Playgroud)

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


Chr*_*ram 10

或者,如果您使用的是 es6,您应该能够使用箭头函数

$(edit_link).click(() => changeViewMode(myvar));
Run Code Online (Sandbox Code Playgroud)


Phi*_*ert 8

是的,像这样:

$(edit_link).click(function() { changeViewMode(myvar) });
Run Code Online (Sandbox Code Playgroud)