作者TonyQ (沉默是金。)
看板Ajax
标题Re: [问题] 根据 if 决定叫用哪一个function
时间Thu Sep 22 23:29:32 2011
※ 引述《senser (彷佛曾经一起死过)》之铭言:
: 这某种层度像是种变数污染
: 感觉还没写过的东西 上面却叫得出来
: 或是不小心用到了同样名字 会产生难预料又难debug的问题
: 2.
: Overwrite问题:
: (function(){
: function sayHelloThenHi(){
: alert('hello');
: }
: sayHelloThenHi();
: function sayHelloThenHi(){
: alert('hi');
: }
: sayHelloThenHi();
: })();
: 这会有甚麽结果呢? 他会跟你讲两声hi
: 直观上这是我们想要的吗?
我会说你根本就不应该有任何可能性写出这种code ...
你说你没包 (function(){}) 作scope protection 就算了,
有作你还搞出这种 code ,这是写 code 的人白目。XD
不过怕得是没作 scope protection ,
其实 scope protection 才是个好习惯。
其实这件事情还不是主要的问题啦,
主要得问题还是在於没作 scope protection时,
他会等价成
window.sayHelloThenHi = function(){
}
这才是讨厌的
: (function(){
: var sayHelloThenHi=function(){
: alert('hello');
: }
: sayHelloThenHi();
: sayHelloThenHi = function(){
: alert('hi');
: }
: sayHelloThenHi();
: })();
: 此例中 他会先说hello在说hi
: 感觉似乎是我们比较想要的结果
: 至於为什麽? 相信你已经知道了
: 结论:
: 那到底要怎麽写function比较好呢
: 1.
: 如果你JAVA或是C#等等classical的语言实在太强了
: 为什麽要为js这种诡异的prototypal语言改习惯??
: 那千万记住把function xxx(){}这种东西写在每个context的最前面
: 这就可以省掉大部分错误和麻烦
: (这也就是很多js的书说宣告变数要在最前面)
就我的认知,变数宣告在最前面主要是避免重复宣告,
因为 js 的 local variable 都是同一个 scope,
所以
function (){
if(true){
var k = "hi";
}
alert(k);
}
还是会印出 "hi" 来,所以每一个变数命名,
其实是有在 if/for/while 里面的都还是会互相污染,
只有 function 里面的不会。
所以都列在前面一眼就知道哪些有被用过,要取新的也比较方便;
但是缺点就是变数跟实际用到它的地方离有点远,
个人是喜欢根据功能需求尽可能拆子函式分开管理变数。
当然 i 这种回圈专用的变数除外啦 :P
: 2.
: 如果你想钻研js这诡异的语言
: 你的function应该大部分会出现在你global abatement的object下面
: 如
: var MySite = {
: my_awesome_func : function(){
: //do something good
: }
: };
: MySite.my_awesome_func(); //invoke
: 或是expression的写法
: var callback = function(){
: do some useful stuff
: };
: 这常常用於callback的传递...
: 总之你应该不会有机会写
: function bad(){
: //still do something
: }
: 这种东西
一般这种东西只会出现在所谓的 private helper function
完全没有打算让外人存取。
(放在自定义 global context 底下会有被存取到的危险)
(function(){
function my_private(){
alert("hi");
}
window.my_global_context= {
do_somthing:function(){
my_private();
}
}
})();
以这个例子来讲,其他人完全没有机会从外部改掉你的 my_private实做,
要就要他整套从 do_something 开始都自己 overwrite。
对一些讨厌自己的 code 被乱改或者控制欲比较强的家伙,这是常见的作法。
当然,private static helper 要有名称重复的状况,这也是有点扯。
以上的例子也可以写成 var my_private = function(){ }
纯粹是看个人的使用习惯就是了。
实务上除了这种 private helper 或 Constructor 有机会这样写以外,
其他的状况都还是匿名函式赋值的写法居多。
var xx = function(){
}
或
var my ={
xx:function(){
}
}
: 真是抱歉 讲太多废话了.. 一打就很难停下来..
: 因为国内有少数教材 常会有不是很正确的观念
: 让我以前刚学习时 走了不少冤枉路
: 以至於看到种观念有关的东西 我就特别想讲
: 加上js又是很特别的语言 常常有人用其他语言的逻辑来套
: 但事实上含意是不同的
: 希望有人有耐心可以看到这里
: 如果有错误 也希望可以指正:D
每个语言都有他们自己的语法特性,如果要用其他语言来套,
而且那些人对他们口中的「其他语言」也真的有够多了解的话。
其实他们很多观念还是蛮一致的。
--
I am a person, and I am always thinking .
Thinking in love , Thinking in life ,
Thinking in why , Thinking in worth.
I can't believe any of what ,
I am just thinking then thinking ,
but worst of all , most of mine is thinking not actioning...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 198.203.175.175
※ 编辑: TonyQ 来自: 198.203.175.175 (09/22 23:33)
※ 编辑: TonyQ 来自: 198.203.175.175 (09/22 23:34)
1F:推 s25g5d4:TonyQ必推 话说....Tony好萌 (逃 09/23 21:04
2F:→ TonyQ:好萌是什麽梗啊 XD 09/24 00:27
3F:→ s25g5d4:有个画师叫Tony 他画的画还不错 然後#(&%@*!所以Tony好萌 09/24 13:38