2013-08-18 87 views
0

我希望能夠看到綁定事件時可用的回調函數內部的值。如果在綁定,則函數內部的事件函數定義我可以通過關閉看到價值:將參數傳遞給名稱引用的回調函數

var number = 777; 
$('span').click(function() { 
    alert(number); //alerts 777 - available through closure 
}); 

但如果在「數字」變量是不可用的功能被預先確定,關鍵是行不通的。該功能number_alerter無法看到「數字」變量函數是否綁定到事件是這樣的:

$('span').click(number_alerter); 

看來,唯一的辦法是用「數字」的說法,並通過定義函數在「數字」 varible的功能:

//function defined somewhere earlier 
function number_alerter(e, number) {  
    alert(number); 
} 
... 
//current scope 
var number = 777; 
$('span').on('click', function(e) { 
    return number_alerter(e, number); 
}); 

我的問題是,是否有另一種方式來這varible傳遞給「number_alerter」功能?也許這也有可能通過關閉?

編輯: 這是上述可能需要的真實情況。我有兩個功能:

array_sort(array, compare_function) 
compare_values(value1, value2, case_insensitive) 

功能array_sort使用函數array_sort時傳遞給compare_values函數只有兩個值,而第三大小寫不敏感的參數也應通過。我知道如何做到這一點的唯一方法是包裝compare_values功能到另一個功能:

var my_array = []; 
var case_insensitive = true; 
var wrapper = function(value1, value2) { 
    compare_values(value1, value2, case_insensitive) 
} 
array_sort(my_array, wrapper); 

有沒有其他辦法,我能做到嗎?

+1

你爲什麼這樣做。稍微回過頭來描述一下你試圖解決的實際問題。它只是試圖保存幾個字符? – FakeRainBrigand

+0

@FakeRainBrigand,這主要是爲了更好地理解JavaScript。 –

+0

好的。只是你知道,如果這種情況出現在實際的應用程序中,這意味着你的代碼會混淆大多數人。 – FakeRainBrigand

回答

0

您的問題必須在其他地方。據你描述,以下

var number=777; 
var alerter=function(){ 
    alert(number); 
}; 
$("span").click(alerter); 

工作得很好。參看JSFiddle 而且,是的,如果您需要訪問某個變量的已定義狀態(例如,爲每個範圍定義點擊計數器),則最好使用閉包。

編輯:哦,我明白

$('span').click(
    (function() { 
     return number_alerter})()); 

這並不是做到這一點。此時您必須傳遞函數名稱。

+0

您將函數定義爲與變量'number'相同的可見性範圍,這就是爲什麼您可以通過閉包查看變量。但我知道你已經明白了你自己。我不明白你最後一個關於傳遞函數名字的評論,因爲這正是我正在做的。 –

1

您可以使用number_alerter來返回回調函數,並使用閉包。像這樣

function number_alerter(num) { 
    return function(){alert(num);}; 
} 

// different scope 
var number = 777; 
$('span').on('click', number_alerter(number)); 

jsFiddle

+0

這當然是一種方法,謝謝!但我需要改變number_alerter函數,這可能並不總是可能的。 –

+0

@Maximus:那麼你將需要你的'wrapper',或者一些'make_wrapper'輔助函數。 – Bergi

相關問題