javascript关闭,不工作?

时间:2010-11-15 15:03:00

标签: javascript telerik closures

我有一个函数,我调用它来检索滑动窗格(telerik splitter控件) 我以为我可以使用这个功能

function getZone() {
        var slidingZone = $find("<%= slidingZone.ClientID %>");
        return function () { return slidingZone; };
    }

这样它就不必每次都“找到”滑动区域。但它不起作用。

这确实......

function getZone() {
        var slidingZone = $find("<%= slidingZone.ClientID %>");
        return slidingZone;    
}

你能告诉我为什么第一个不工作吗?

顺便说一下,我这样用它......

function hideTreePane() {
        var paneId = "<%= slidingPane.ClientID %>";
        getZone().undockPane(paneId);
        return true;
    }

5 个答案:

答案 0 :(得分:4)

您需要调用从getZone返回的函数:

getZone()().undockPane( paneId );

它无效,因为函数getZone本身没有名为undockPane的成员。

修改

我认为最好这样做:

function getZone() {
    if ( getZone.cache === undefined )
        getZone.cach = $find("<%= slidingZone.ClientID %>");
    return getZone.cache;
}

然后你会这样打电话:

getZone().undockPane( paneId );

答案 1 :(得分:4)

因为你返回一个函数而你需要评估它... 如果使用第一个功能,这可能有用..

function hideTreePane() { 
    var paneId = "<%= slidingPane.ClientID %>"; 
    var zoneFunc = getZone();
    zoneFunc().undockPane(paneId); 
    return true; 
} 

答案 2 :(得分:2)

在您的第一个示例中,您将返回一个函数,因此getZone()成为一个函数,您需要getZone()()来获取所需的slidingZone值。

在这种情况下,无需将返回值包装在函数中。

答案 3 :(得分:2)

好吧,第一个函数返回一个函数,你想要执行内部函数。

如果您调用它的结果,您将看到它的工作,例如:

getZone()();

我认为你想要以下内容,使用一个立即执行的匿名函数,只调用$find方法一次,存储其结果:

var getZone = (function() {
  var slidingZone = $find("<%= slidingZone.ClientID %>");
  return function () { return slidingZone; };
})();

答案 4 :(得分:2)

您将从第一个示例返回一个函数,而不是值。您需要评估它的工作功能。尝试类似的东西。

var slidingZone;
function getZone() {
    if (!slidingZone) {
        slidingZone = $find( ... );
    }
    return slidingZone;
}

最好将它作为“类”的一部分,以便缓存变量不在全局范围内。