jQuery Отложенный Ajax, проблема с областью JavaScript? - PullRequest
2 голосов
/ 16 февраля 2011

Я подумал, что это будет довольно просто, но это не работает (пример на http://jsfiddle.net/QtjaG/):

$.resx = function() {
    var result = this;

    return $.get("/", function() {
        result = "yo";
    });
};

var labels;

$.resx.call(labels).then(function() {
    console.log(labels);
});

Поскольку $.resx.call(labels) должен установить контекст this в $.resx() на labels не должен console.log(labels) log yo?

Ответы [ 2 ]

2 голосов
/ 16 февраля 2011

В функции (функция «$ .resx») вы устанавливаете «результат», чтобы ссылаться на то же, что и «метки». Однако в обратном вызове из «$ .get ()» вы устанавливаете его в «yo». Эта строковая константа "yo" представляет собой значение , отличное от "меток", которое на самом деле ни к чему не было инициализировано. В JavaScript нет способа иметь ссылку на ссылку ; если «метки» были определены как имеющие какое-либо значение:

var labels = "this is a string";

тогда «result» в конечном итоге будет другой ссылкой на эту строку. Однако строки являются неизменяемыми, поэтому из обработчика успеха $ .get () вы не можете изменить эту строку.

Попробуйте это:

$.resx = function() {
    var result = this;

    return $.get("/", function() {
        result[0] = "yo";
    });
};

var labels = ["not yo"];

$.resx.call(labels).then(function() {
    console.log(labels[0]);
});
0 голосов
/ 16 февраля 2011

Если вы console.log (this), вы получите окно.Это потому, что область действия вашей функции глобальная.Я думаю, что вы ищете метод «применить»: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/apply. Однако я не думаю, что вам это нужно, потому что вы можете сделать следующее, просто ниже.Закрытие функции callBack будет обернуто вокруг ссылки «метки».А поскольку функции являются объектами первого класса, вы можете передавать их напрямую как делегаты и вызывать их как callBack (x);

$.resx = function(callBack) {      
    return $.get("/", function() {       
        callBack("yo");
    });  
};

var labels;

$.resx(function(response){
    labels = response;  
});
...