为了账号安全,请及时绑定邮箱和手机立即绑定

jQuery将更多参数传递给回调

jQuery将更多参数传递给回调

互换的青春 2019-08-14 17:13:46
jQuery将更多参数传递给回调有没有办法将更多数据传递给jQuery中的回调函数?我有两个函数,我希望回调$.post,例如,传递AJAX调用的结果数据,以及一些自定义参数function clicked() {     var myDiv = $("#my-div");     // ERROR: Says data not defined     $.post("someurl.php",someData,doSomething(data, myDiv),"json");      // ERROR: Would pass in myDiv as curData (wrong)     $.post("someurl.php",someData,doSomething(data, myDiv),"json"); }function doSomething(curData, curDiv) {}我希望能够将自己的参数传递给回调,以及从AJAX调用返回的结果。
查看完整描述

3 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

解决方案是通过闭包绑定变量。


作为一个更基本的例子,这里是一个接收和调用回调函数的示例函数,以及一个示例回调函数:

function callbackReceiver(callback) {
    callback("Hello World");}function callback(value1, value2) {
    console.log(value1, value2);}

这会调用回调并提供单个参数。现在你想提供一个额外的参数,所以你将回调包装在闭包中。

callbackReceiver(callback);     // "Hello World", undefinedcallbackReceiver(function(value) {
    callback(value, "Foo Bar"); // "Hello World", "Foo Bar"});

或者,更简单地使用ES6箭头功能

callbackReceiver(value => callback(value, "Foo Bar")); // "Hello World", "Foo Bar"

至于你的具体例子,我没有.post在jQuery中使用该函数,但是对文档的快速扫描表明回调应该是具有以下签名的函数指针

function callBack(data, textStatus, jqXHR) {};

因此我认为解决方案如下:

var doSomething = function(extraStuff) {
    return function(data, textStatus, jqXHR) {
        // do something with extraStuff
    };};var clicked = function() {
    var extraStuff = {
        myParam1: 'foo',
        myParam2: 'bar'
    }; // an object / whatever extra params you wish to pass.

    $.post("someurl.php", someData, doSomething(extraStuff), "json");};

怎么了?

在最后一行中,doSomething(extraStuff)调用和该调用的结果是一个函数指针

因为extraStuff它作为参数传递给doSomething它在doSomething函数的范围内。

extraStuff在返回的匿名内部函数中引用doSomething它时,它被闭包到外部函数的extraStuff参数。doSomething返回后即使如此也是如此。

我没有测试过上面的内容,但是我在过去的24小时内编写了非常相似的代码,它的工作原理正如我所描述的那样。

您当然可以传递多个变量而不是单个'extraStuff'对象,具体取决于您的个人偏好/编码标准。


查看完整回答
反对 回复 2019-08-14
?
呼唤远方

TA贡献1856条经验 获得超11个赞

使用时doSomething(data, myDiv),实际上是调用函数而不是引用它。

您可以doStomething直接传递函数,但必须确保它具有正确的签名。

如果你想按照它的方式保持doSomething,你可以将它的调用包装在一个匿名函数中。

function clicked() {
    var myDiv = $("#my-div");
    $.post("someurl.php",someData, function(data){ 
      doSomething(data, myDiv)
    },"json"); }function doSomething(curData, curDiv) {
    ...}

在匿名函数代码中,您可以使用封闭范围中定义的变量。这是Javascript作用域的工作方式。


查看完整回答
反对 回复 2019-08-14
  • 3 回答
  • 0 关注
  • 551 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信