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

相關問題