JavaScript 函數調用

JavaScript 函數內部的代碼會在“某物”調用它時執行。

調用 JavaScript 函數

在函數被定義時,函數內部的代碼不會執行。

在函數被調用時,函數內部的代碼會被執行。

調用函數通常也可以說“啟動函數”或“執行函數”。

在本教程中,我們使用“調用”。

以函數形式調用函數

實例

function myFunction(a, b) {
    return a * b;
}
myFunction(10, 2);           // 將返回 20

親自試一試

以上函數不屬于任何對象。但是在 JavaScript 中,始終存在一種默認的全局對象。

在 HTML 中,默認全局對象是 HTML 頁面本身,所有上面的函數“屬于”HTML 頁面。

在瀏覽器中,這個頁面對象就是瀏覽器窗口。上面的函數自動成為一個窗口函數。

myFunction() 和 window.myFunction() 是同一個函數:

實例

function myFunction(a, b) {
    return a * b;
}
window.myFunction(10, 2);    // 也會返回 20

親自試一試

這是調用函數的常見方法,但并不是一個好習慣。

全局變量、方法或函數很容易在全局對象中產生命名沖突和漏洞。

this 關鍵詞

在 JavaScript 中,被稱為 this 的事物,指的是“擁有”當前代碼的對象。

this 的值,在函數中使用時,是“擁有”該函數的對象。

請注意 this 并不是變量。它屬于關鍵詞。您無法改變 this 的值。

全局對象

當不帶擁有者對象調用對象時,this 的值成為全局對象。

在 web 瀏覽器中,全局對象就是瀏覽器對象。

本例以 this 的值返回這個 window 對象:

實例

var x = myFunction();            // x 將成為 window 對象
function myFunction() {
   return this;
}

親自試一試

調用一個函數作為一個全局函數,會導致 this 的值成為全局對象。

作為變量來使用 window 對象很容易使程序崩潰。

作為方法來調用函數

在 JavaScript 中,您可以把函數定義為對象方法。

下面的例子創建了一個對象(myObject),帶有兩個屬性(firstName 和 lastName),以及一個方法(fullName):

實例

var myObject = {
    firstName:"Bill",
    lastName: "Gates",
    fullName: function () {
        return this.firstName + " " + this.lastName;
    }
}
myObject.fullName();         // 將返回 "Bill Gates"

親自試一試

fullName 方法是一個函數。該函數屬于對象。myObject 是函數的擁有者。

被稱為 this 的事物,是“擁有”這段 JavaScript 代碼的對象。在此例中,this 的值是 myObject。

測試一下!修改這個 fullName 方法來返回 this 的值:

實例

var myObject = {
    firstName:"Bill",
    lastName: "Gates",
    fullName: function () {
        return this;
    }
}
myObject.fullName();          // 將返回 [object Object](擁有者對象)

親自試一試

以對象方法來調用函數,會導致 this 的值成為對象本身。

通過函數構造器來調用函數

如果函數調用的前面是 new 關鍵字,那么這是一個構造函數調用。

它看起來像你創建一個新的函數,但由于 JavaScript 函數是對象,你實際上創建一個新對象:

實例

// 這是函數構造器:
function myFunction(arg1, arg2) {
    this.firstName = arg1;
    this.lastName  = arg2;
}
// 創建了一個新對象:
var x = new myFunction("Bill", "Gates");
x.firstName;                             // 會返回 "Bill"

親自試一試

構造器調用會創建新對象。新對象會從其構造器繼承屬性和方法。

構造器內的 this 關鍵詞沒有值。

this 的值會成為調用函數時創建的新對象。