奇怪的关闭行为

时间:2010-06-27 19:33:19

标签: javascript jquery closures

出于某种原因,下面的一些代码并没有像我预期的那样 - 可能是由于我最终对它应该如何表现的误解。

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确实设置为我期望的(jQuery对象匹配div.content)。什么事情发生在这里,我错过了什么?

2 个答案:

答案 0 :(得分:2)

这是他们在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/

答案 1 :(得分:1)

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

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");

*我在函数定义周围添加了括号,以增加清晰度。