作者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)
1F:推 ChowMein:我想 function declaration 和 expressions 的差异 09/19 19:47
2F:→ ChowMein:不是原po问题的所在, func1 func2 已经在之前宣告了, 09/19 19:48
3F:→ ChowMein:应该没必要写成这样 09/19 19:49
4F:→ senser:他会有这问题 我觉得他可能会对function不太清楚 09/20 12:15
5F:→ senser:所以对ECMA应该应该要了解一下才是 09/20 12:17
6F:→ senser:再者 js中应要尽量避免 function xx(){} 这种declaration 09/20 12:20
7F:推 genomini:为什麽要尽量避免使用function xx(){} 这种declaration呢 09/20 12:55
8F:推 musie:怕撞名吧... 09/20 15:27
9F:推 ChowMein:原po的问题应该是不知道 function 也是个 object 09/20 18:40
10F:→ ChowMein:所以不知道要用 playsound = func1; 09/20 18:41
11F:→ senser:恩 可能他的问题没这麽复杂 但我只是想厘清一些观念 09/21 12:03
12F:→ senser:而且他在里面invoke playsound 其实会丧失context 09/21 12:05