2011-06-07 4 views
1

мне нужно, чтобы получить номер строки из функции JavaScript:Как получить значение из функции JavaScript?

function cap_check(){ 
    var row; 

    $('td').change(function(){ 
     row = $(this).parent().parent().children().index($(this).parent()); 
     alert(row); 
    }); 

    alert(row); 
} 

В функция, row правильно насторожить. Вне функции это undefined.

+1

не могли бы вы включить html, который идет с этим кодом – mcgrailm

+0

взгляните на это сообщение. это то же самое. http://stackoverflow.com/questions/2611980/return-value-from-nested-function-in-javascript – JAiro

+0

@JAiro: Нет, это не то же самое. –

ответ

2

Там нет никакого способа, что вызов cap_check будет когда-либо предупреждения ничего, кроме undefined. Функция не является статическим объектом. Когда вы вызываете функцию, она создает новый экземпляр во внутреннем стеке. row будет инициализирован как undefined, и новый обработчик клика будет привязан к td элементам (также вряд ли будет полезно), поскольку каждый повторяющийся обработчик события будет связан каждый раз, когда вы вызываете cap_check).

Скорее всего, вы хотите что-то вроде этого:

var cap_check=(function() { 
    var row; 
    $('td').change(function(){ 
     row = $(this).parent().parent().children().index($(this).parent()); 
     alert(row); 
    }); 
    return function() { 
     alert(row); 
    }; 
}()); 

Это является прямоприменяемой функцией. Когда скрипт запускается, часть функции ПЕРЕД «возвратом» выполняется немедленно, создавая односвязное событие, и возвращает функцию, которая ссылается на экземпляр оригинальной функции. Это создает замыкание , что означает, что функция поддерживает ссылку на объекты своего родителя (в данном случае переменную row). Поэтому ваш обработчик событий и функция, возвращаемая как cap_check, теперь будут всегда ссылаться на тот же экземпляр row.

Итак, теперь любой код, который вызывает cap_check, всегда будет возвращать то же значение, что и в результате события change.

Fiddle:

http://jsfiddle.net/RagUe/5/

(Обратите внимание, что я изменил событие "click" вместо "изменения", чтобы сделать его легко проверяемые).

+0

Thanx приятель, я попробую это и скоро вас обновит. – Learner

+0

У меня возникли проблемы с пониманием того, как и почему это работает - есть ли какие-то материалы для чтения или просмотра YouTube, на которые я могу смотреть, чтобы лучше понять, какие механизмы или концепции здесь работают? Я не понимаю, что происходит, когда вы завершаете функцию и другие вещи в parens (это не делает кортеж?) Или что происходит, когда функция возвращает функцию и т. Д. – Addem

0

$('td').change(function(){ })

Change позволяет передать функцию обратного вызова, которая будет запускаться при каждом изменении значения.

Таким образом, просто привязывая обратный вызов, он не запускает его. Он будет работать только при изменении значения. Поскольку остальная часть функции выполняется до изменения значения, значение row не определено.

Просто поместите остальную часть скрипта в функции обратного вызова

+1

У него уже есть обратный вызов, ему просто нужно сохранить остальную часть функции в пределах ее области. – Swift

+0

Спасибо за быстрые ответы. Я пробовал это, но это влияет на какой-то другой onChange, запускающий в остальной части кода. Вот почему мне нужно чтобы вывести значение из функции jq. Thanx – Learner

0

Вы не должны держать оставшуюся часть функции в функции изменения?

function cap_check(){ 
    var row; 
      //-----------------------Jquery current table row 
    $('td').change(function(){ 
      row = $(this).parent().parent().children().index($(this).parent()); 

      //rest of script here 
     }); 

} 
-1

Ваш row внутри функции, находится в полностью другой области тогда строки снаружи.

Так что, когда вы находитесь за пределами функции change()row не определена, но, как только change срабатывает, row получает значение

function cap_check(){ 
    var row; 

    $('td').change(function(){ 
     row = $(this).parent().parent().children().index($(this).parent()); 
     alert(row); //only has a value on change 
    }); 

    alert(row); //undefined 
} 
+0

-1 Полон общих неправильных утверждений. Делайте это правильно. – Raynos

+0

@ Райнос, что бы вы ни называли? – Neal

+0

Это слишком широкое обобщение. JavaScript не является асинхронным. Только обработчики событий (вроде) и Ajax. Передача функции в качестве параметра не означает ничего о том, когда функция будет выполнена. –

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