2012-06-22 2 views
2

Для этого блока кода:переменной Javascript неожиданно неопределенными

if(!skipit) 
    { 
    var update_argument=''; 
    if (document.formname.fieldname) 
     { 
     update_argument=document.formname.fieldname[document.formname.fieldname.selectedIndex].value; 
     } 
    window.setTimeout('updatepcols(update_argument)',250); 
     return false; 
    } 

Я получаю ошибку в моем SetTimeout вызова, что «update_argument» было неопределенным. Когда я изменил строку, где я присвою ей значение нулевой строки от «var» до «window.», Ошибка исчезла, и код работал. Я бы предположил, что здесь есть проблема с областью, но я не следую ей. Почему update_argument не будет определен в этом случае, но поместить его в объект окна позволяет мне использовать его? (updatepcols - это функция, которая обновляет столбцы ценообразования.)

ответ

4

Попробуйте это вместо этого. Использование closure таким образом сохраняет ссылку на update_argument

setTimeout(function(){ 
    updatepcols(update_argument); 
},250); 

У меня есть забавное чувство сценарий, который вы передаёте в качестве текста, когда оценивается, выполняется в глобальном масштабе, то есть за пределами локальной области, в которых update_argument является объявлен.

setTimeout('updatepcols(update_argument)',250); 
+1

Возможно, вы объясните, ПОЧЕМУ это работает. – jfriend00

+1

Это работает, потому что, когда вы передаете строку в 'setTimeout', это' eval'd в глобальной области. Когда вы передаете функцию, она может читать локальные переменные. –

+1

P.S. Это хорошая практика * всегда * передавать функции 'setTimeout'. Никогда не пропускайте струны. –

1

Я не уверен, если это вопрос сфера или нет, но изменяя ваш SetTimeout вызов должен сделать трюк:

window.setTimeout('updatepcols('+update_argument+')',250); 

Эта скрипка демонстрирует: http://jsfiddle.net/mLrqZ/

+0

Функциональный, но способствующий плохой, потенциально опасной практике ... – canon

+0

Я поддержал, потому что это был прямой ответ на мой вопрос, но я соглашусь на другой, потому что он учит лучшему пути. – TecBrat

0

Изменить ваше выражение , Должно быть написано, как это, если вы хотите передать локальную переменную в функции обратного вызова:

window.setTimeout('updatepcols('+update_argument+')', 250); 

или если вы хотите использовать замыкание вместо этого, то сделать это:

window.setTimeout(function(){ updatepcols(update_argument) }, 250); 

Да, вроде другие говорят, что использование закрытия - лучшая практика.

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