Re: [問題] 根據 if 決定叫用哪一個function

看板Ajax作者 (彷彿曾經一起死過)時間14年前 (2011/09/19 17:13), 編輯推噓4(408)
留言12則, 4人參與, 最新討論串6/8 (看更多)
您可能對於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)

09/19 19:47, , 1F
我想 function declaration 和 expressions 的差異
09/19 19:47, 1F

09/19 19:48, , 2F
不是原po問題的所在, func1 func2 已經在之前宣告了,
09/19 19:48, 2F

09/19 19:49, , 3F
應該沒必要寫成這樣
09/19 19:49, 3F

09/20 12:15, , 4F
他會有這問題 我覺得他可能會對function不太清楚
09/20 12:15, 4F

09/20 12:17, , 5F
所以對ECMA應該應該要了解一下才是
09/20 12:17, 5F

09/20 12:20, , 6F
再者 js中應要盡量避免 function xx(){} 這種declaration
09/20 12:20, 6F

09/20 12:55, , 7F
為什麼要盡量避免使用function xx(){} 這種declaration呢
09/20 12:55, 7F

09/20 15:27, , 8F
怕撞名吧...
09/20 15:27, 8F

09/20 18:40, , 9F
原po的問題應該是不知道 function 也是個 object
09/20 18:40, 9F

09/20 18:41, , 10F
所以不知道要用 playsound = func1;
09/20 18:41, 10F

09/21 12:03, , 11F
恩 可能他的問題沒這麼複雜 但我只是想釐清一些觀念
09/21 12:03, 11F

09/21 12:05, , 12F
而且他在裡面invoke playsound 其實會喪失context
09/21 12:05, 12F
文章代碼(AID): #1ETmUqLX (Ajax)
討論串 (同標題文章)
文章代碼(AID): #1ETmUqLX (Ajax)