Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将参数作为参数传递函数?_Javascript - Fatal编程技术网

Javascript 将参数作为参数传递函数?

Javascript 将参数作为参数传递函数?,javascript,Javascript,是否可以将带有参数的javascript函数作为参数传递 例如: $(edit_link).click( changeViewMode( myvar ) ); 使用“闭包”: 这将创建一个匿名临时函数包装器,该包装器了解参数并将其传递给实际回调实现。是,如下所示: $(edit_link).click(function() { changeViewMode(myvar) }); $(edit_link).click(changeViewMode.bind(null, myvar)); 否,

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

例如:

$(edit_link).click( changeViewMode( myvar ) );
使用“闭包”:

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

是,如下所示:

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

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

$(edit_link).click(
  function() { changeViewMode(myvar); }
);
因此,当您传递一个没有参数的匿名函数时,该函数将使用闭包中的变量调用您的参数化函数。引用MDN:

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

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

您的代码应该如下所示:

$(edit_link).click(function() { changeViewMode(myvar) });
$(edit_link).click(changeViewMode.bind(null, myvar));
旁注:我假设您处于全局上下文中,即
变量是
窗口
;否则,请使用
this
而不是
null

您可以这样做

var message  = 'Hello World';

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

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

activate(callback);
或者,如果回调包含更灵活的逻辑,则可以传递对象


这是一个遵循费迪南德·拜尔方法的例子:

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

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

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

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

它看起来像JQuery,而且很可能是,但这并不重要。无论使用什么Javascript库,参数和函数的用法都是一样的。@Guffa-我想知道是否应该用jQuery@Lucia请考虑更改已接受的答案。如果您正在使用Read,请考虑如果您想调用对象上的函数,则需要调用BUDE()。单击(function(){this.doSomething();}.bind(myObj));这将使“this”成为myObj。在处理很多这样的问题时,这不是一个性能问题吗?例如,您正在渲染一行onPress,您有10000行。这将为每一行创建一个新的匿名临时函数包装器。还有其他方法吗?@JoshuaPinter技术本身不是问题。如果需要10000次相同的函数调用,只需将包装保存在一个变量中,就可以创建一次。如果您需要传递10000个不同的上下文,那么您几乎无能为力。谨防过早优化:与性能一样,您需要衡量是否存在问题。今天的JavaScript引擎非常强大,可能会以令人惊讶的方式优化代码。@FerdinandBeyer真棒,谢谢你的提示。一位朋友告诉我这是一种糟糕的做法,你应该在你的
构造函数中使用
this.myFunction=this.myFunction.bind(this)
。但是,正如您所说,当您必须为每一行传递不同的上下文时,就像您单击以打开该行的详细信息页面的所有不同行一样,这是无法避免的。@FerdinandBeyer,让我们假设myvar是一个字符串,它在作为闭包传递changeViewMode的两次连续调用之间发生更改,但是changeViewMode总是接收myvar的第一个值,我想调用闭包函数,将不同的参数值分配给同一个myvar变量,谢谢,这对我很有帮助。像这样使用它:
$.ajax(url).done(handler.bind(this,var1,var2))哪个选项最好?使用闭包还是使用bind函数?如果有演出,请告诉我impact@Varun看见