Promise - Q函式庫


前言

Promise(承諾)已經確定是下一代Javascript的ES6標準。在這之前,已經有數套相關的函式庫支援這個新的特性。這篇文章是接著jQuery中的Promise而寫來的,從jQuery的Deferred概念來理解另一套知名的函式庫 - Q。

這篇文章主要還是簡介,深入的應用還是請再到Q的網站上觀看相關的API文件。

閱讀全文

jQuery中的Promise


前言

這篇文章是為了要理解在jQuery中的Promise機制而整理的。

jQuery在幾年前就有Deferred物件的概念,當時Promise並未成為真正的標準,而今時今日Promise已成為ES6的正式標準,相信未來jQuery中的Promise作法,將會改變為實作ES6中的標準。

Promise的概念並不容易理解,從這裡開始反而簡單些,不論實作的方式如何,它的目的始終是差不多的,從以下的內容可窺得一二。

閱讀全文

Node.js error-first callback


前言

"error-first"(錯誤優先)顧名思義 - 程式碼與參數都以"錯誤"的處理為最優先。

error-first callback也常被稱為“errorback”, “errback”或“node-style callback”

異步程式撰寫時,我們在函式裡在最後完成時,並不會作回傳(return)值的動作,而是交給callback持續執行下去,這種開發風格稱為 延續傳遞風格 Continuation-Passing Style, CPS)

在Node.js中的幾乎所有的內建函式與模組提供的函式,都是依這種風格與規則製作的函式。callback通常以匿名函式被傳入函式最後一個參數,以此在函式的完成時繼續呼叫執行。

閱讀全文

Strict Mode(嚴格模式)


Javascript中的物件導向

對於一個直譯式語言而言,物件導向特性是不是有那麼樣的重要,有很多不同的意見,有人認為物件導向除了會拖慢執行的速度,不良的物件導向語法,反而會出現更多不預期的程式臭蟲(bugs)。

Javascript中的物件導向存在有很多與現在流行語言完全不同的物件導向特性,也就是說如果你有學過Java、C++之類的物件導向語法,在Javascript中不是很難作到,就是要用很有技巧性的方式才能達成(trick),尤其是在舊的Javascript標準中,如果不依靠這些技巧,有些物件導向的特性根本很難作得到。當然,新的Javascript標準(ECMAScript5或更新的6)中,對於OOP已經有大幅度的改進。

網路上有關於Javascript的物件導向開發部份的教學,很多都是舊式的標準的內容,新的標準中已經有很多新的作法,相較於舊式的內容,使用上更為簡單而且安全。例如用於建立物件的Object.create方法,用於getter與getter的方法,以及許多方便開發者的Array方法。

本文專注於相容於目前大部份瀏覽器(與Node.js)的物件導向新特性,相容性可以到ECMAScript相容表觀看。

閱讀全文

為何要使用Node.js


這個問題很不容易回答,Node.js能作的事,用PHP, Python, Ruby之類的伺服器端腳本程式語言,都能作得到而且更簡單。Node.js在這幾年成為火紅的一種技術,其實不是沒有原因的,本文簡單的說說一些有關這個問題的解答,以及最近的新聞。

閱讀全文

Callback簡單一例


名詞解釋

不論這個專有名詞用中文的"回呼"、"回叫"、"回調",都是聽起來很怪異的講法,callback在英文是"call back"兩個單字的合體,你應該有聽過"call me back"的英文,大概是有客戶留電話給你,當你在忙碌時,請你等會有空時再"回電"給它,這裡的說法是指在電信公司裡的callback名詞的涵意。而用在軟體工程上,callback它的使用情境其實也是有類似的地方,維基上的說明我就不說了,其實我也有看沒有懂。雖然在許多程式語言中都可以實現callback,但這裡專注的是在Javascript上的"異步(asynchronous) callback"機制。其他關於"同步callback機制"參考維基百科。

閱讀全文

Closure圖解


Closure範例程式碼

先看範例,一個典型的closure(閉包)會長這個樣子:


var varGlobal = 'x';

function outer(paramOuter){
  var varOuter ='y';

  function inner(paramInner){
    var varInner ='z';

    //print
    console.log(varGlobal);
    console.log(varOuter);
    console.log(varInner);
    console.log(paramOuter);
    console.log(paramInner);
  }

  return inner;
}

var func = outer('a');
func('b');

閱讀全文