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

IT技术 javascript
2021-02-07 09:05:05

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

例子:

$(edit_link).click( changeViewMode( myvar ) );
6个回答

使用“闭包”:

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

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

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

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

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

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

您的代码应如下所示:

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

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

哪个选项最好?使用闭包还是使用绑定函数?请让我知道是否有任何性能影响
2021-03-13 09:05:05
2021-03-22 09:05:05
谢谢,这对我有帮助。像这样使用它:$.ajax(url).done(handler.bind(this, var1, var2));
2021-03-28 09:05:05

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

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

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

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

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

是的,像这样:

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