2010-11-04 2 views
1

У меня есть этот кодJquery, доступа к переменным из функции

function getSelectData(id) { 
    jQuery(id).change(function() { 
     var value=''; 
     jQuery(id+" option:selected").each(function() { 
      value =jQuery(this).val() ; 
     }); 
     console.log(value); 
    }); 
    return value; 
} 

var d = getSelectData("#sort_post_date"); 
console.log(d); 

Как я могу получить доступ к переменной «значение», я пробовал разные методы, но ничего, где console.log (значение); , значение выхода, но вне ничего, спасибо за помощь!

ответ

9

Вам нужно изменить значение перемещения вне функции, чтобы оно было привязано к закрытию. Как это:

function getSelectData(id) { 
    var value=''; 

    // set value to be the current selected value 
    value = jQuery(id+" option:selected").val(); 

    // change value whenever the box changes 
    jQuery(id).change(function() { 
     value = jQuery(id+" option:selected").val(); 
     console.log("I see a change! -> "+value); 
    }); 

    console.log(value); 
    return value; 
} 

var d = getSelectData("#sort_post_date"); 
console.log(d); 

Вот скрипка, чтобы показать, что это работает: http://jsfiddle.net/ZvuMh/

+0

Спасибо за помощь !! Я очень ценю это ! Я пытаюсь использовать этот метод, но все равно пуст, я могу просто увидеть значение где «console.log (value)»; , внешнее изменение функции не работает :(, снаружи пусто – mIRU

+1

, поэтому 'console.log (value);' показывает правильное значение, но 'console.log (d);' does not? – Hogan

+0

'console.log (значение); 'показывает правильное значение, но' console.log (d); 'пусто – mIRU

1

Это классический вопрос о закрытии. Вот некоторые из самых подобных

Event handlers inside a Javascript loop - need a closure?

javascript timer or intervals created in loop using closure

Javascript closure inside loops - simple practical example

Нижняя линия, переменная value не является локальным для обработчиков событий вы создаете. Итак, все обработчики обработчиков будут иметь значение, которое value было, когда внешняя функция закончилась. В этом случае он остается пустым.

+0

Должен быть миллион из них. – Hogan

0

Вы не можете получить доступ к своей переменной значения за пределами функции, в которой она была объявлена. Это называется областью переменных. Читайте на области видимости переменных here

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

Так что в этом случае :

function getSelectData(id){ 
    var value='';   
    jQuery(id).change(function() { 
     jQuery(id+" option:selected").each(function() { 
      value =jQuery(this).val() ; 
     }); 

     console.log(value); 
    }); 
    return value; 
} 

var d=getSelectData("#sort_post_date"); 
console.log(d); 
+1

Не пользуется крышкой лучше? – Hogan

+0

Я согласен - научиться использовать закрытие здесь изменит способ написания JavaScript навсегда. – hybernaut

+0

@ Хоган: Определенно, не прочитал мой код правильно. Хотя вам все еще нужно узнать об области переменных, прежде чем вы сможете понять закрытие. –

0

Попробуйте definining переменного значения в глобальном масштабе:

var value=''; 

function getSelectData(id) { 
    jQuery(id).change(function() { 
     value=''; 
     jQuery(id+" option:selected").each(function() { 
      value =jQuery(this).val() ; 
     }); 
    console.log(value); 
    }); 
    return value; 
} 

Там также нет смысла возвращаться «значение» здесь, поскольку он установлен в обработчике событий ... там ничего не будет (или просто старое значение) в точке возврата.

+0

Есть точка. Используя закрытие, вы можете уменьшить «мякину» в глобальном масштабе. См. Мой пример кода. – Hogan

+0

Я не вижу, как это закрытие. Вы не возвращаете функцию, вы просто возвращаете var, содержащий строку. Если вы хотите, чтобы каждый обработчик изменений отслеживал свое предыдущее значение, почему бы просто не определить его в функции обработчика и вызвать из него какой-то метод обратного вызова? Ну, я думаю, что обработчик сам закрывается вокруг значения var, так что, если есть тонны обработчиков, за один раз отслеживается только один вал? Это цель этого? Возвращаемое значение из getSelectData все еще не кажется полезным. – jmans

+0

Это замыкание, потому что 'function() {value = ''; jQuery (id + "option: selected"). each (function() {value = jQuery (this) .val();} 'включает ссылку на переменную' значение'. 'value' включен в замыкание для функции – Hogan

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