定義函式的方法有兩種,一種是函式宣告,一種是函式表示式
//函式宣告
function
()//函式表示式
()
他們兩個不同的地方在於,函式宣告會有乙個提公升(相當於會在執行**前讀取函式宣告),而函式表示式不會有
//函式宣告
function
()//函式表示式
()
在函式表示式中,就像變數一樣,會被賦予undefined值,而不會有提公升,所以呼叫語句必須在函式表示式之後。
遞迴
要構成乙個簡單的遞迴函式,就是通過名字呼叫自身構成的
function
factorial
(num)else
}
但是這種方式在factorial函式重新命名後將出現錯誤,為了保證日常的修改和使用,將使用下面這種方式
function
factorial
(num)else
}console.log(factorial(5));//120;
var anothe***ctorial=factorial;
factorial=null;
console.log(anothe***ctorial(5));//120
arguments.callee
指向的是當前正在執行的函式,因此可以用他來實現遞迴
這個方法時常會被我們用來解決for迴圈中的i值問題
var
list=document.getelementsbytagname("li");
(function
question
()).i=i;
}})();
閉包:指的是有權訪問另乙個函式作用域中的變數的函式。一般建立閉包的方法就是在函式內部建立另乙個函式。
當某個函式被呼叫的時候,會建立乙個執行環境及相應的作用域鏈,然後使用arguments和其他命名引數的值來初始化活動物件。但是在作用域中,外部函式的活動物件始終位於第二位,外部的外部屬於第三位,一直到全域性變數為止。我們的後台中每個執行環境都有乙個表示變數的物件,全域性中的變數物件始終存在,而我們定義的函式這樣的區域性環境的變數物件只在執行的過程中存在。執行完畢就會被銷毀掉,我們的記憶體中只會保留我們的全域性變數,但是閉包就有所不同。
在另乙個函式內部定義的函式會將外部函式的活動物件新增到他的作用域鏈中,當這個內部函式中包含外部函式的變數作為返回值的時候,外部的環境並不會被銷毀掉,不然內部的環境將無法找到目標物件,因此匿名函式的作用域鏈仍然在引用這個活動物件,也就是說,他的執行環境的作用域鏈會被銷毀,但是活動物件仍然會被保留在記憶體中,知道匿名函式被銷毀後,他才會被銷毀。
作用域鏈的這種配置方式引出了乙個值得注意的***,就是閉包只能取得包含函式中任何變數的最後乙個值。
var
list=document.getelementsbytagname("li");//設定了1個ul,裡面有3個li
(function
alertitem
() }
})();
//解決方法,利用閉包,在函式內部編寫函式
(function
alertitem
() }(i);
}})();
//利用匿名函式
(function
alertitem
() })(i)
}})();
//利用物件的鍵對值
(function
alertitem
() }
})();
//利用es6中的let
(function
alertitem
() }
})();
//利用arguments.callee
(function
alertitem
()).i=i;
}})();
函式表示式 閉包
有權訪問另乙個函式作用域內變數的函式。常見的方式就是在乙個函式的內部建立另外乙個函式。functiona b a a內的b可以訪問a的內部變數color 閉包只能取到包含函式中任何變數的的最後乙個值。function a return arr console.log a 0 10 console.l...
函式4 函式表示式 閉包
閉包 函式中的函式 用於獲取函式內部變數的函式 function a return b console.log info 報錯 info is not defined console.log a hello 在全域性作用域中,如果想訪問a函式中的變數info,直接訪問會報錯,因為a函式體是個作用域,...
函式 函式表示式 作用域 閉包
var f function function f 函式宣告和函式表示式的主要區別是,函式宣告會被前置,而函式表示式作為變數,會被提公升。下方是js執行時的邏輯 前置和變數提公升 var f function f f function var f function function f f 上方 直...