【问题标题】:Odd closure behavior奇怪的闭包行为
【发布时间】:2010-06-27 19:33:18
【问题描述】:

由于某种原因,以下代码的行为与我预期的不同——可能是由于我对它的行为方式存在误解。

var contentPane = widget.children("div.content").first();

var success = function (content) {
    return function (data, successCode, httpRequest) {
        content.innerHTML = data;
    };
}(contentPane); 

我已经附加了我的调试器(好吧,无论如何都是 Firebug),它看起来像 content.innerHTML = data; 行上的“内容”是 Window 对象,而我应该是 var contentPane = widget.children("div.content").first(); 的结果,对吗?

请注意,如果我在函数之前设置断点,contentPane 确实设置为我所期望的(匹配 div.content 的 jQuery 对象)。这是怎么回事,我错过了什么?

【问题讨论】:

    标签: javascript jquery closures


    【解决方案1】:

    这是他们在 1.4 中添加的 $.proxy() :),如下所示:

    var contentPane = widget.children("div.content").first();
    
    var success = $.proxy(function (data, successCode, httpRequest) {
                           this.innerHTML = data;
                  }, contentPane);
    

    这只是让常见情况的闭包声明就像你的一样短得多,$.proxy(function, whatThisIs)


    对于“怎么了?”部分......没什么,你确定你检查的是正确的变量吗? this 指的是您的函数内部的window,但content 是您想要的jQuery 对象...您可以在此处查看快速测试:http://jsfiddle.net/vhcde/

    【讨论】:

    • @downvoter - 说 what 不正确会很有帮助,因此它实际上可以帮助某人。
    【解决方案2】:

    问题可能出在您的选择器上。在此页面上运行时,以下工作正常

    var contentPane = $("#header")[0];
    
    var success = (function (content) {
        console.info(content);
        return function (data, successCode, httpRequest) {
            console.warn(content);
            content.innerHTML = data;
        };
    })(contentPane); 
    
    success("ohai");
    

    * 为了更加清晰,我在函数定义周围添加了括号。

    【讨论】:

      猜你喜欢
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多