顯示行號要用下面的步驟來啟用:
- 點按編輯器左邊灰色的邊緣

- 從選單中選擇「Show Line Numbers」,有勾選起來就會顯示了
|
|
閉包是一個經常使用於Javascript預先定義函式的作法。閉包技術在現在許多程式語言已包含,或有類似概念的作法,事實在早在1960年代就已經在很古老的Schema語言中被實作。閉包的產生是很簡單的概念,在函式中包含的內嵌函式即可產生出閉包,通常還包含有未進行定義數值的變數,稱之為自由變數(free variable)。在許多說法中,會認為閉包並非一個真正的函式,而是一個函式和引用環境組合的個體,行為類似於函式。這種說法的根據是函式只會存在一個實例,而不同的閉包是不同的實例。
最簡單的解說範例是這個,一個用來作相加的函式:
1
2
3
4
5
6
7
8
9
10
11
|
function makeAdder(x) {
return function(y) {
return x + y;
};
}
var add5 = makeAdder(5);
var add10 = makeAdder(10);
alert(add5(2)); // 7
alert(add10(2)); // 12
|
仔細看看執行了add5=makeAdder(5)後,add5的得到數值是什麼?是一個匿名的函式。而add10是另一個匿名的函式。這兩個形成了閉包,但是是共享原先makeAdder函式的定義。
另一個可以觀察每個閉包的獨立性的範例:
1
2
3
4
5
6
7
8
9
10
11
|
function a(){
var i=0;
function b(){
alert(++i);
}
return b;
}
var c = a();
c(); //i=1
var d=a();
d(); //i=?
|
在這個範例中的第11行執行後,會出現1還是2的alert視窗?答案很清楚,因為閉包是彼此獨立的執行空間,當然是1。
透過這些技術文章的說明,我歸結出一些關於Javascript閉包的特性如下:
- 閉包可以讓你把一些資料和可操作資料的函數聯繫在一起
- 閉包使得垃圾回收機制不會收回其中函數所占用的資源
參考資料:
|
Google在9月22日首次發表了Google Chrome Frame。這個是一個以外掛其他瀏覽器為主的軟體,這個瀏覽器外掛可以讓其他非Google Chrome的瀏覽器(例如Internet Explorer),享受Google Chrome般的功能,例如快速的Javascript執行引擎V8,或是HTML 5新規格的能力。當然,這個首次發佈的版本一開始就針對Internet Explorer,官方部落格上也說明,因為像Internet Explorer不論是6/7/8版本,使用的人數比例,仍然是不容忽視。藉由安裝外掛軟體,可以讓這些使用者比較容易接受,如果是要它們更換另一個瀏覽器,反而是困難的事。
對於網站程式開發者而言,只要使用以下的標籤在網頁中,就可以偵測使用者是不是有安裝這個外掛
<meta http-equiv="X-UA-Compatible" content="chrome=1" />
更多的資訊可以到相關的開發文件去觀看,注意這仍然是一個早期發表的版本,還有許多未完成功能及程式臭蟲。
Tags: chrome | google | 瀏覽器
|
函數宣告方式
在Douglas Crockford的「Javascript: The Good Parts」書中,在函數的章節,開宗明義的就說「Functions in JavaScript are objects」。函數本身就是一種物件,和物件的連繫也是密不可分。因為函數是物件,所以也可以存放於變數、物件或陣列之中。在這本書中建議的函式使用方式,都是像下面第二種這樣的:
//一般的函數定義方式
function add(a,b){
return a + b;
};
//稱為function literal notation的函數定義方式
var add = function (a, b) {
return a + b;
};
//使用add函數相加兩個數
var sum=add(1,2);
//像數值一樣,函數也可以指定(複製)給別的變數
var sum=add;
typeof sum;
//刪除add函數之後,sum函數還存在
delete add;
typeof sum;
var result=sum(2,3);
當然函數的宣告方式有很多種,這一種是需要學習的部份,或許這和其他程式語言有些差異。
接下來要了解的是每個函數都有一個自動內建的參數陣列,稱為arguments。像在下面的範例中,可以看到它的功用,利用arguments可以傳入不確定數量的參數值。但是,arguments並不是一個真正的陣列,雖然它有length的屬性,這個部份之後再討論。
function sumOnAll() {
var total=0;
for (i = 0; i < arguments.length; i++) {
total += arguments[i];
}
return total;
}
sumOnAll(1,2,6);
sumOnAll(1,1,2,6,7);
|