2

是否可以在 jsonp Ajax 调用的回调中指定我们的特定上下文?

我发现这样做的唯一方法是指定回调名称但不实现它,因此回调进入带有所需上下文的成功方法:

    $.ajax({
        type: "GET",
        url: 'someurl',
        dataType: 'jsonp',
        jsonpCallback: 'myCallbackName',
        context: this,
        success: function (response) {
                   console.log(this); //this must be the context specified earlier
        }
    });

问题是即使它正在工作,我也会收到很多错误:

TypeError:myCallbackName 不是函数

知道如何在不引起错误的情况下实现这一目标吗?

谢谢

艾蒂安

4

2 回答 2

2

这应该可以解决问题:

$.ajax({
    type: "GET",
    url: 'someurl',
    dataType: 'jsonp',
    jsonpCallback: 'myCallbackName',
    context: this,
    success: delegate(this, function (response) {
        console.log(this); //this must be the context specified earlier
    })
});

var delegate = function(context, func) {
    return function() {
        return func.apply(context, arguments);
    }
}

但是,您会得到TypeError: myCallbackName is not a function,因为您没有定义myCallbackName。只需添加

var myCallbackName  = function() { }

PS 更多关于 JavaScript 中的委托在这里

于 2013-09-24T18:22:20.440 回答
0

.call([context],[arguments]...)可以通过在调用末尾附加 a 来在 JavaScript 中设置上下文。如...

console.log.call(window, this)

该选项将修复任何Illegal Invocation错误,并有多种其他风格,例如.bind().apply().

如果您只是试图隐式保存较早的内容,您的第二个选择this是将其保存到变量中。保存它的好时机是在 AJAX 调用之前,但要确保它是全局的。我不确定你为什么不只使用提供的成功函数,因为它会提供数据。

var _this = this;
$.ajax(...);

function myCallbackName() {
   console.log(_this);
} 
于 2013-09-24T17:49:11.727 回答