2013-11-06 5 views
0

У меня есть этот код ниже, который должен запускаться test() при каждом изменении размера окна.Внешняя переменная и область видимости внутри функции jQuery

var i = 0; 
var test = (function() { 
    console.log(i++); 
})(); 

$(window).resize(function() { 
    test(); 
}); 

Код: http://jsfiddle.net/qhoc/NEUdA/

Однако я получаю Uncaught TypeError: undefined is not a function потому test() не доступен в изменении размера.

Может кто-нибудь помочь объяснить, почему? И каково обходное решение: (1) функция самоисполнения и (2) иметь возможность называть ее в пределах resize?

+0

'test' доступен в' resize', это просто, что вы установили он равен undefined. –

+0

@ Kevin, но как это не выполняется? –

+0

вы должны получить 1 вход в консоль в настоящий момент, а затем ошибку. –

ответ

1

Следующая следует сделать трюк, хотя это на самом деле не больше, чем просто convienent вызов функции сразу же после объявления:

var i = 0; 
var test = (function test() { 
    console.log(i++); 
    return test; 
})(); 

$(window).resize(function() { 
    test(); 
}); 
1

Вы, вероятно, хотите сделать это:

var test = function() { 
    console.log(i++); 
}; 

вместо этого:

var test = (function() { 
    console.log(i++); 
})(); 

Обновлено скрипку: http://jsfiddle.net/NEUdA/1/

Вторая форма будет вызывать функцию на месте, и потому он не имеет оператора return, он будет возвращен undefined, поэтому тест не будет определен.

Почему вы хотите, чтобы тест выполнялся самостоятельно?

+0

Самоисполнение требуется как способ инициализации этой функции. Я мог бы выполнить 'test();' сразу после, но кажется нечистым. –

+0

Если вам действительно нужно выполнить функцию, верните из нее другую функцию, которая будет назначена тестовой переменной. Эта возвращаемая функция будет вызвана в window.resize. Еще лучше, сделайте что-то похожее на шаблон модуля и добавьте функцию, которая должна быть вызвана при изменении размера переменной. http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html – pax162

Смежные вопросы