закрытие javascript, не работает? - PullRequest
1 голос
/ 15 ноября 2010

У меня есть функция, которую я вызываю для получения скользящей панели (управление сплиттером Telerik) Я думал, что смогу использовать эту функцию

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 ]

4 голосов
/ 15 ноября 2010

Потому что вы возвращаете функцию и вам нужно ее оценить ... Если вы используете первую функцию, это может сработать.

function hideTreePane() { 
    var paneId = "<%= slidingPane.ClientID %>"; 
    var zoneFunc = getZone();
    zoneFunc().undockPane(paneId); 
    return true; 
} 
4 голосов
/ 15 ноября 2010

Вам нужно будет вызвать функцию, которую вы возвращаете из getZone:

getZone()().undockPane( paneId );

Она не работает, потому что сама функция getZone не имеет члена с именем undockPane.

РЕДАКТИРОВАТЬ:

Я думаю, что было бы лучше сделать это:

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

Тогда вы бы назвали так:

getZone().undockPane( paneId );
2 голосов
/ 15 ноября 2010

Вы возвращаете функцию из первого примера, а не значение. Вам нужно оценить функцию, чтобы она работала. Попробуйте что-то вроде.

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

Было бы лучше, чтобы это было частью "класса", чтобы переменная кэширования не входила в глобальную область.

2 голосов
/ 15 ноября 2010

Итак, первая функция возвращает функцию, и вы хотите, чтобы внутренняя функция была выполнена.

Если вы вызовете результат, вы увидите, как он работает, например ::100100

getZone()();

Я думаю, вы хотите, чтобы следующее: использовать немедленно выполненную анонимную функцию, чтобы вызывать метод $find только один раз, сохраняя его результат:

var getZone = (function() {
  var slidingZone = $find("<%= slidingZone.ClientID %>");
  return function () { return slidingZone; };
})();
2 голосов
/ 15 ноября 2010

В первом примере вы возвращаете функцию, поэтому getZone() становится самой функцией, и вам нужно сделать getZone()(), чтобы получить нужное значение slidingZone.

Нет необходимостиоберните ваше возвращаемое значение в функцию для этого случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...