2014年3月22日 星期六

js function invocation and function context

目前學習javascript,其中有個好玩的地方同時我也覺得頗重要的地方,今天就特別來記錄一下,那就是如標題所述,function invocation 和 function context,在js當中呢,每個函式都會有兩個隱性的parameter,分別是 this 和 arguments。

arguments是一個很像Array的物件但是注意! 它不是Array,如同名字表是那樣,它代表的是實際傳入的參數。關於this在我看來就是指function context,根據不同的function invocation就會決定不同的function context,那麼this到底是何物呢?  this它指向一個物件,並且這個物件是有關於這個函式是怎麼被invoke的,聽起來還是有點模糊對吧 :) 先繼續往下看便知曉。

關於function invocation基本上有四種

1. invocation as a function
function ja(){
    console.log(this);
}

var vja = function(){
    console.log(this);
}

你執行上面code,將會看到function context是window(global context),

2. invocation as a method
看到名字就知道,這個function是屬於一個物件,因此我們創建一個物件
給予一個property reference到一個function
function globalSay(){console.log(this);};

var obj = {};

obj.say = globalSay;
obj.say();

執行上面code後,將會看到function context是obj這個物件,因此光從這邊就可以看出this是由這個function是怎麼被invoke所決定的

3. invocation as a constructor
簡言之就是藉由new這個keyword所產生的結果
function test(){
    this.say = function(){
        console.log(this);
    }
}

var obj1 = new test();
var obj2 = new test();

obj1.say();
obj2.say();

new這個keyword,它會產生一個新物件,並將這個物件的function context就是自己

4. invocation with aplly and call method
這個是我認為javascript很特別的地方這個方法可以,讓你隨意的指定function context
舉個例子來看看
function test(value){
    this.value = value;
}

var obj1 = {};
var obj2 = {};

test.call(obj1, 2);
test.call(obj2, 3);

console.log(obj1.value);
console.log(obj2.value);
如上obj1和obj2將會被增加value這個屬性。
call和apply的差別是在
xxx.call(this, x,x,x,x);
xxx.apply(this, [x,x,x,x]);

我覺得這功能的確滿方便的,javascript的this就是這麼....該說好用嗎?還是恐怖?
因為用不好的話,似乎會造成很多問題的感覺。

如果以前是學習C++來的人,會覺得js的this,會覺得非常與眾不同吧 :)
動態語言就是如此,有著靜態語言不同的風格,隨著電腦速度越來越快,我不知不覺中越來越喜歡用動態語言來寫程式了,像是python,反而C++越來越少碰了 :( 不知道要不要找時間回去熟悉C++ :(

回到正題,我覺得隨著mobile熱烈的發展,javascript已經越來越重要了,畢竟越來越多人已經支援js所規定出的標準了,已經是個合適的時機來學習JS了,而且可以另外學習function programming的style,會覺得別了一番滋味~



2014年3月15日 星期六

國軍online已過六個月

時間總是不知不覺流逝,這半年來的當兵生活,我想是有讓我眼睛及身體獲得適當的休養,只是程式能力就可能稍稍退步了,總覺得每次回到家,都得重新熟悉寫程式的手感和閱讀英文文章的感覺,這種FU真不好受,不過換個角度想想,要是我可以訓練到快速熟悉,那似乎也是一個不錯的能力呢(笑

好啦,這次文章也只是一個純粹抒發,沒目的性的亂寫而已 : ) 在航校的日子,其實也已經算是很熟悉了,每次晚上我都已經無聊到不知道做什麼了,幾乎都是在發呆,或是看看書,我一直都很期待可以帶筆電阿啊!! 我不懂裡面的學生都可以用了,為啥我們不能用? 替代役在航校總是一個特別的存在,在裡面被勤務連鄙視,但是卻又總在長官身邊有說有笑,平常作息卻又得像學生那樣,但卻不像學生那樣可以帶筆電 :-S 其實待了這麼久,我一直不知道替代役的地位到底算高還算低 :)

話雖如此,但是平常我們還是得看長官臉色,其實我一直滿討厭裡面有些長官,真的很愛賣弄自己的官階,而且總感覺他們看不起替代役,但是需要做事的時候,卻又一直用我們....感覺我們比勤務連還好用阿,一想到這些我恨不得明天就是我退伍的日子:(

不過呢,其實我還滿喜歡自己待的單位,因為這邊幾乎沒有我所說的那些長官臭脾氣,只是事情多了點雜了點,會有點累,但是我覺得這樣也好,這樣一來我晚上才會好睡點,反正晚上根本沒有任何娛樂,不如乖乖洗洗睡。在這邊其實我受到學姊滿多的照顧,很慶幸遇到她,這單位裡面也只有她跟我年齡最近 :) 剛開始我是覺得可能這樣彼此的代溝比較少會比較好聊天,但是其實我是一個不怎麼會講話的人,也不太懂開話題,而且腦子裝的都是跟程式有關的東西,所以其實也沒特別和她一直聊天,只是遇到問題就一直煩她:) 希望不會對她造成太多困擾。所以,我一直在想我是不是該訓練怎麼和人交際,可是我又很討厭去花力氣想話題,因為感覺有點假,我個人是認為遇到想法契合的人,話題應該就會源源不絕,想到什麼就說什麼,我比較喜歡自然的感覺 :) sigh,有時候我總覺得自己把這社會的一切想得太過美好,或許我該試著接受事實吧...

在航校,我看到了人生百態,知道人可以有如此多面,上一秒對某人開口迎笑,下一秒變臉走人,其實這也是我覺得我在航校越待越累的原因,雖然我都是旁觀者的身分並非當局者,但是看到這些,心情總是無法好起來,不要說軍官了,其實我感覺替代役同伴們多少也存在這樣的人,而且好像還會在背後捅你一刀,說你壞話,尤其是航校又分校部、學部,以國家概念來講,就像中心和邊疆,學校本身就充滿不公,俗話說上樑不正下樑歪,所以...咳咳,話就不說的太明了,也因此我總是非常期待可以快點到放假時間,因為這樣充滿假面的地方,讓我非常不習慣,我不知道當前跟我講話的人是真心的,還是假的,我只能確定當彼此有利益關係時,雙方當下總會採取互利共生的合作方式。有些人總說看眼睛就知道他是說真話還假話,但是我覺得這完全不準,眼睛會飄移,不代表是說謊,就我感覺眼睛會飄移,有很多原因:
  1.沒信心
  2.不確定(可能再回憶
  3.不好意思盯著人
有諸多原因。

總之在航校看到許多不公平的地方,自己卻又無能為力改善,只能乖乖看著事情發生,我有點百感交集,有時候我很羨慕天上的鳥兒,那樣自由自在遨翔,看著他們的時候,總覺得身邊的迷霧消失無影無蹤,讓我暫時喘了一口氣 :) 

這篇好像寫的雜亂無序 :)
不過到讓我抒發了不少心情,其實同時間我也是有再試著努力學習的 :)
目前正在試著熟悉javascript中,或許改天就可以看到我發的心得了

再來一首音樂~