2011-06-07 171 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

你能否请包括与此代码 – mcgrailm 2011-06-07 14:59:47

+0

去看看这篇文章的HTML。这是相同的。 http://stackoverflow.com/questions/2611980/return-value-from-nested-function-in-javascript – JAiro 2011-06-07 14:59:37

+0

@JAiro:不,它不一样。 – 2011-06-07 15:03:29

回答

2

没有办法,调用比undefined其他cap_check将时刻警惕任何东西。一个函数不是一个静态对象。当你调用一个函数时,它会在内部堆栈上创建一个新实例。 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事件结果相同的值。

小提琴:

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

(请注意,我改变了“点击”,而不是“变”事件,使其容易测试)。

+0

Thanx好友,我会尽快更新。 – Learner 2011-06-07 15:46:45

+0

我无法理解这是如何工作的,以及为什么这样工作 - 是否有一些阅读或YouTube观看材料可以帮助我们更好地理解这里的工作机制或概念?我不明白当你将函数和其他东西包装在parens中时会发生什么(不会形成元组?),或者函数返回函数时发生了什么等等。 – Addem 2017-02-20 01:34:51

0

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

更改,您可以通过将运行每当值改变的回调。

所以只要附加回调它不会运行它。它只会在值更改时运行。由于函数的其余部分在值更改之前运行,所以row的值未定义。

只需将脚本的其余部分在回调

+1

他已经有回调,他只需要保留其范围内的功能 – Swift 2011-06-07 15:01:06

+0

感谢您的快速反应球员。我尝试过,但它影响其他onChange触发代码的其余部分。这就是为什么我需要从jq函数中取出数值。 Thanx – Learner 2011-06-07 15:05:11

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 2011-06-07 15:05:53

+0

@Raynos,你是什么意思? – Neal 2011-06-07 15:06:18

+0

这是一个过于笼统的概括。 JavaScript不是异步的。只有事件处理程序(有点)和Ajax。将函数作为参数传递并不意味着函数何时执行。 – 2011-06-07 15:06:33

相关问题