【问题标题】:jQuery Deferred Ajax, JavaScript scope issue?jQuery Deferred Ajax,JavaScript 范围问题?
【发布时间】:2011-02-16 19:35:47
【问题描述】:

我认为这很简单,但它不起作用(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) 应该将$.resx() 中的this 上下文设置为labels,不应该console.log(labels) 记录yo

【问题讨论】:

    标签: javascript jquery ajax jquery-deferred


    【解决方案1】:

    在函数(“$.resx”函数)中,您确实将“result”设置为指代“labels”指代的同一事物。但是,在“$.get()”的回调中,您将其设置为“yo”。那个字符串常量“yo”是一个与“labels”不同的值,它实际上并没有被初始化为任何东西。在 JavaScript 中没有办法有一个 对引用的引用;如果“标签”已被定义为具有某种价值:

    var labels = "this is a string";
    

    那么“结果”最终会成为对该字符串的另一个引用。但是,字符串是不可变的,因此您无法从“$.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]);
    });
    

    【讨论】:

      【解决方案2】:

      如果你使用 console.log(this),你会得到 window.log。那是因为你的函数的作用域是全局的。我认为您正在寻找的是“应用”方法: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;  
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-24
        • 1970-01-01
        • 2012-08-12
        • 2012-04-17
        • 2013-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多