作者senser (彷彿曾經一起死過)
看板Ajax
標題Re: [問題] 根據 if 決定叫用哪一個function
時間Mon Sep 19 17:13:18 2011
您可能對於js的function宣告方式沒有很清楚
但我想可能很多人也有不正確的認識
js的function宣告方式分為兩種
function declaration和function expressions
主要會因為hoisting 而有些微的不同
invoke的方式 大概分為四種
主要和this的binding有關
在這例子中 您的設計想法是完全可行且合理的
只是實做上要注意
首先如果你加了() 就是一種invocation
意思就是執行這function
所以應該寫成
$(selector).mousedown(function(){
if(using IE){
func1(); //invoke
}else {
func2(); //invoke
}
});
如果你不直接invoke
應該用function expression
因為functon declaration絕不應出現在{}block中
在if中作function declaration
每個browser對這種錯誤會有不同的奇怪詮釋
(新的browser supports 所謂的 function statement)
再者也有可能因為hoisting而overwrite的問題產生
if(using IE){
var myHandler = func1;
}else {
var myHandler = func2;
}
$(selector).mousedown(myHandler); //function copying
有興趣可以參考這兩篇
http://kangax.github.com/nfe/
http://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/
※ 引述《coldollsheep (加油加油^^)》之銘言:
: 不好意思 問一個比較粗淺的問題
: 我做了一個按鈕 點了會有聲音
: IE 跟其他瀏覽器是採用不同的方法
: 如以下程式碼
: 可以看到我毎次點擊都必須判斷一次
: //關鍵那顆鈕
: $('#click_btn').mousedown(function (ev)
: {
: //1.處理音效
: if ($.browser.msie)
: {
: document.getElementById("soundeffect").src=soundfile;
: } else
: {
: var _audio2 = document.createElement('audio') ;
: _audio2.src = soundfile ;
: _audio2.play()
: }
: }
: ----
: 有沒有辦法變成這樣
: func1()
: {
: 實際內容
: }
: func2()
: {
: 實際內容
: }
: //1.處理音效
: if ($.browser.msie)
: {
: playsound() = func1(); <------這裡就是關鍵 我不知道怎麼弄這裡
: 觀念不好不好意思
: } else
: {
: playsound() = func2();
: }
: //關鍵那顆鈕
: $('#click_btn').mousedown(function (ev)
: {
: //1.處理音效
: playsound();
: }
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 71.104.219.9
※ 編輯: senser 來自: 71.104.219.9 (09/19 17:15)
※ 編輯: senser 來自: 71.104.219.9 (09/19 17:22)
※ 編輯: senser 來自: 71.104.219.9 (09/19 17:31)
※ 編輯: senser 來自: 71.104.219.9 (09/19 17:31)
※ 編輯: senser 來自: 71.104.219.9 (09/19 17:35)
※ 編輯: senser 來自: 71.104.219.9 (09/19 17:42)
推 ChowMein:我想 function declaration 和 expressions 的差異 09/19 19:47
→ ChowMein:不是原po問題的所在, func1 func2 已經在之前宣告了, 09/19 19:48
→ ChowMein:應該沒必要寫成這樣 09/19 19:49
→ senser:他會有這問題 我覺得他可能會對function不太清楚 09/20 12:15
→ senser:所以對ECMA應該應該要了解一下才是 09/20 12:17
→ senser:再者 js中應要盡量避免 function xx(){} 這種declaration 09/20 12:20
推 genomini:為什麼要盡量避免使用function xx(){} 這種declaration呢 09/20 12:55
推 musie:怕撞名吧... 09/20 15:27
推 ChowMein:原po的問題應該是不知道 function 也是個 object 09/20 18:40
→ ChowMein:所以不知道要用 playsound = func1; 09/20 18:41
→ senser:恩 可能他的問題沒這麼複雜 但我只是想釐清一些觀念 09/21 12:03
→ senser:而且他在裡面invoke playsound 其實會喪失context 09/21 12:05