函數(shù)聲明,函數(shù)表達(dá)式區(qū)別
1,函數(shù)聲明特點(diǎn)
- 執(zhí)行前先聲明
- 有函數(shù)名稱
- 可以把調(diào)用語句放在函數(shù)聲明前
2, 函數(shù)表達(dá)式(匿名函數(shù)(anonymous function),拉姆達(dá)函數(shù))
- 無函數(shù)名稱
- 函數(shù)賦值給一個(gè)變量
- 必須先賦值,在執(zhí)行
| 標(biāo)題 | 順序 | 備注 |
|---|---|---|
| 函數(shù)聲明 | 執(zhí)行-》 獲取聲明 -》 執(zhí)行 | null |
| 函數(shù)表達(dá)式 | 獲取值 -》在執(zhí)行 | null |
遞歸(調(diào)用自己)
遞歸函數(shù)是一個(gè)函數(shù)通過改名字調(diào)用自身的情況構(gòu)成的
function factorial(num){
if (num <= 1){
return 1;
} else {
return num * factorial(num-1);
}
}
思考題目:
假設(shè)你正在爬樓梯。需要 n 階你才能到達(dá)樓頂。每次你可以爬 1 或 2 個(gè)臺(tái)階。
你有多少種不同的方法可以爬到樓頂呢?
閉包(通俗:函數(shù)中的函數(shù),可以訪問外面函數(shù)變量)
- 閉包是一個(gè)有權(quán)訪問另一個(gè)函數(shù)變量的的函數(shù)
- 創(chuàng)建閉包的常見方式,就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù)
function createComparisonFunction(age){
return function(obj1, obj2){
var value1 = obj1[age]
var value2 = obj2[age]
if(value1 > value2) {
return -1;
} else {
return 1
}
}
}
var compare = createComparisonFunction("name");
var result = compare({ name: "Nicholas" }, { name: "Greg" });
alert(result)
上面函數(shù)作用域鏈如下:

作用域鏈.png
可以這么畫作用域鏈:
- 1,畫出 全局,局部函數(shù),閉包的參數(shù) 和 兩個(gè)執(zhí)行環(huán)境
- 2,將執(zhí)行環(huán)境和 三部分進(jìn)行連接理解
閉包與變量
閉包只能取得包含函數(shù)中任何變量的最后一個(gè)值。
題目1:
下面這段代碼想要循環(huán)延時(shí)輸出結(jié)果 0 1 2 3 4,請(qǐng)問輸出結(jié)果是否正確,如果不正確,請(qǐng)說明為什么,并修改循環(huán)內(nèi)的代碼使其輸出正確結(jié)果?
var result = function() {
for (var i = 0; i < 5; ++i) {
(function (num) {
setTimeout(function() {
console.log(num + " ");
}, 100);
})(i)
}
}
result()
題目2
如果想讓執(zhí)行依次加1怎么修改代碼?
function add() {
var x = 1;
console.log(++x);
}
add() // 執(zhí)行輸出?
add() // 執(zhí)行輸出?
this對(duì)象
| 名稱 | 描述 | |
|---|---|---|
| 局部函數(shù) | 基于函數(shù)的執(zhí)行環(huán)境綁定 | |
| 全局函數(shù) | this 等于 window | |
| 匿名函數(shù) | 匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其 this 對(duì)象通常指向 window |
思考
如何讓匿名函數(shù)this指向局部函數(shù)