聲明&表達式
-
格式
函數聲明
function print(s) {
console.log(s);
}
函數表達式
var print = function(s) {
console.log(s);
};
-
調用
函數聲明 作用域內調用
函數表達式 只在聲明后調用
-
提升
函數聲明 將整個函數代碼塊提升至作用域最頂部
函數表達式 只提升 被聲明的變量,不提升函數
-
分號
函數聲明 可加可不加
函數表達式 必須加分號來表示結束
聲明前置
-
變量
因為JS引擎的工作方式是先解析代碼獲取所有被聲明的變量,然后逐行運行。
所以所有的變量的聲明語句都會被提升到代碼頂部。
-
函數
因為JS引擎 將函數名視同變量名,所以
采用function命令聲明函數時,整個函數被提升到代碼頭部。
采用賦值語句聲明函數時,函數在原位置被聲明。
arguments
- arguments是一個對象。這個對象只有在函數體內部,才可以使用。
- 由于JS允許函數有不定數目的參數,所以我們需要一種機制,可以在函數體內部讀取所有參數。
- arguments對象包含了函數運行時的所有參數,arguments[0]就是第一個參數,arguments[1]就是第二個參數,以此類推。
重載
-
定義
允許在同一范圍中聲明幾個功能類似的同名函數,但是這些同名函數的形式參數必須不同
-
作用
解決功能類似 但 處理的數據類型不同的問題。
-
實現
在JavaScript中沒有函數重載的概念,函數通過名字確定唯一性,參數不同也被認為是相同的函數,后面的覆蓋前面的,但是可以用arguments模擬函數重載
function foo() {
if(arguments.length == 1) {
alert(arguments[0] + 1);
} else if(arguments.length == 2) {
alert(arguments[0] + 2);
}
}
foo(1); //輸出 “2”
foo(2, 3); //輸出 “4”
立即執行函數表達式
-
語法
(function sum(i){ })( ); (function sum(i){ }( )); var a= function sum(i){ }( );
-
定義
一種聲明之后就立即進行該函數執行操作的函數
即 聲明一個匿名函數并立刻調用
-
作用
1 不必為函數命名,避免了污染全局變量;
2 函數內部形成了一個單獨的作用域,可以封裝一些外部無法讀取的私有變量。
Tip 通常只對匿名函數使用
作用域鏈
- 作用域是指 變量存在的范圍
由于變量分為全局變量和局部變量,作用域相應分為全局作用域和局部作用域 - 作用域鏈是指 子對象在找不到相關變量時,會一級一級地向上尋找所有父對象的變量 的這種行為