JS函數
函數聲明
- 使用構造函數
var fun = new Function();
- 使用關鍵字
function 函數名(形參){// 函數體
}
- 匿名函數
var fun1 = function(){name = "fun1"
}
函數參數
實參,形參都可以是任意數據類型,瀏覽器執行時不會檢查實參類型和數量,在函數內部做運算時會做強制類型轉換,多的參數會被舍棄,少的會被填充為Underfind
- this:指向函數運行的上下文對象,根據函數被調用的方式不同,this指向的對象也不一樣
函數的調用方式 | this指針的指向 |
---|---|
以函數的形式調用 | window |
以方法的形式調用 | 指向調用方法的對象 |
以構造函數的形式調用 | 指向最新創建的對象 |
call()和apply() | 指向指定的對象 |
function fun1(){console.log(this);
}// 以函數打方式調用
fun1();// 以方法的形式調用
var obj = {name : "obj",fun : function(){console.log(this);},
}// 以apply或call的方式調用
var obj2 = {name : "obj2"
}obj.fun();fun1.apply(obj2);
- argnment 同this一樣,瀏覽器默認傳入的隱藏參數,是保存實參的一個類數組對象,用來分裝實參,其中有一個callee屬性,對應正在執行的函數對象。
作用域
-
全局作用域
- 在函數外部定義的變量就是全局變量,全局變量會作為瀏覽器窗口window對象的屬性保存
- 在全局作用域創建的函數會作為 window對象 的方法保存
- window對象由瀏覽器自動創建
- 生命周期:網頁打開時創建,關閉時銷毀
- 盡量不要在全局作用域定義變量,會污染命名空間
-
函數(局部)作用域
- 在函數內部定義的變量(屬性)和函數(方法)只能在函數內部使用,全局無法使用
- 生命周期:函數執行時創建,執行結束時銷毀
- 使用 window.變量名 訪問全局變量。
- 在函數中,不使用 var 定義的變量會成為全局變量
- 變量的使用遵循就近原則
-
函數的申明提前:使用關鍵字定義的函數會在整個程序執行之前預先執行,因此可以在函數聲明之前調用函數
返回值
使用return返回,無返回值或返回空時(只寫一個return
)返回Underfind
- return會結束整個函數
立即執行函數
函數內建方法
call()和apply()
- 調用這兩個方法時,函數都會執行
- 可以指定一個對象作為函數的第一個參數(this)這個對象會成為函數的this,用來修改函數的上下文對象
- 如果需要傳遞參數
- call:需要將所有要傳遞的參數封裝到數組中,也就是call只接受兩個參數,第一個是一個對象,第二個是參數數組
- apply:可以直接跟在對象后面傳遞,不限制參數個數