CMSimple Drupal Yii 內容管理系統三方案 - 提升台灣中小企業競爭力

目前位置:   首頁 > Program Talk > Javascript

Javascript

根據 ECMA-262 以及這裡的說明:

Javascript 共有以下幾種函式建立的方法:

1. 利用函式建構子建立函式

var sum = new Function('a','b', 'return a + b;');
alert(sum(10, 20)); //alerts 30

2. 利用函式宣告建立函式

function sum(a, b)
{
    return a + b;
}
alert(sum(10, 10)); //Alerts 20;

3. 利用函式表示式建立函式, 函式可以帶名稱或者不帶名稱, 當使用者利用不帶名稱的表示式所建立的函式稱為無名稱函式(anonymous function)

var sum = function(a, b) { return a + b; }
alert(sum(5, 5)); // alerts 10

差別: 表示式所建立的函式, 無法在該表示式之外呼叫所建立的函式, 而且利用表示式所建立的函式即使沒有指定對應變數, 也能直接執行, 此種函式完成後自行呼叫執行的函式稱為自動啟動執行函式(self-invoked function).

例如: 當使用者利用表示式建立 test2 函式後, 只有在表示式中存在 test2 函式, 一旦該表示式執行結束後, 就只能透過表示式函式的對應變數來執行 test2 函式內容, 無法直接呼叫 test2 函式.

var test1 = function test2() { alert(typeof test2); }
alert(typeof(test2)); //alerts 'undefined', surprise!
test1(); //alerts 'function' because test2 is a function.

而利用函式宣告所定義的 test1, 則可以單獨呼叫執行.

function test1() { alert(typeof test1) };
alert(typeof test1); //alerts 'function'
test1(); //alerts 'function'

以下就是一個無名稱函式自行呼叫, 以 'SO' 作為 msg 輸入執行的情形.

(function(msg) { alert(msg); })('SO'); //alerts SO.

 Javascript 的物件繼承:

// 定義一個變數物件, 具有兩個成員變數, a 與 b
var myParent = {
 a: 10,
 b: 50
}
// 利用物件建立方法, 以 myParent 物件定義建立一個案例
// 此一物件案例名稱為 myChild
var myChild = Object.create(myParent);
// 再以 myChild 建立一個案例 myGrandChild
var myGrandChild = Object.create(myChild);
alert(myGrandChild.a); // will alert 10
// 將 myParent 所屬的成員變數 a 設為 20
myParent.a = 20;
// 影響所及, 所有依照 myParent 建立的物件都受到影響
alert(myGrandChild.a); // will alert 20
alert(myChild.a); // will alert 20

Javascript 的變數作用域擴及函式區域內, 而非 C/C++ 的程式區段作用域.

Javascript 只有在離開函式區域外, 函式中所定義的變數才會失效.

function testScope() {
 // 在函式中定義 myTest 變數, 其作用域為函式有效範圍.
 var myTest = true;
 if (true) {
     // 即使在 if 區段中重新宣告 myTest 並給於新值, 此變數仍為前面所定義的同一對應儲值
     var myTest = "I am changed!"
 }
 // 因變數作用域擴及整個函式區域, 因此 myTest 變數執行到 if 區段中已經改變.
 alert(myTest);
}
// 呼叫函式時, 將會列出擴及函式區域作用下的變數對應內容
testScope(); // will alert "I am changed!"

 C/C++ 程式則是區段作用域:

#include <stdio.h>
int main() {
    // 宣告整數變數 x 並賦予 1 的對應
    int x = 1;
    printf("%d, ", x); // 1
    if (1) {
    // 因 C 變數作用域僅及於其所在區段(即 if 區段), 一離開此區段, 此變數即無作用
    int x = 2;
    printf("%d, ", x); // 2
    }
    // 此時列出 x, 將會式在主函式區段中有效作用的第一次宣告與賦值對應
    printf("%d\n", x); // 1
    return 0;
}

 Javascript 函式區段中未採 var 正式宣告的變數, 將會交由物件源頭執行變數追蹤, 若在函式物件上層未有宣告, 則會將此變數在函式上一層中予以宣告, 因此在函式終未採 var 正式宣告的變數, 就會自動成為全域變數.

function testScope() {
 // 函式中的 myTest 未使用 var 正式宣告, 因此會往上一層完成正式宣告, 而成為在函式區域外的全域變數
 myTest = true; // now myTest is global.
 alert(myTest);
}
testScope(); // will alert "true"
// 因為 myTest 受到物件追蹤鏈的作用成為全域變數後
// 即使在函式區域外仍有對應值
alert(myTest); // will alert "true" as well, because now myTest is global.

 參考資料: Javascript 程式師參考手冊

Powered by CMSimple_XH| Template: ge-webdesign.de| 登入