1. 五種聲明方式
1.1 具名函數(shù)
function f(x,y) { return x+y }
f.name // 'f'
1.2.匿名函數(shù)
var f;
f = function(x,y){
return x+y
}
f.name // 'f'
1.3 具名函數(shù)賦值
var f;
f = function f2(x,y){ return x+y }
f.name // 'f2'
console.log(f2) // undefined
1.4 window.Function
var f = new Function('x','y','return x+y')
f.name // "anonymous"
1.5 箭頭函數(shù)
var f = (x,y) => { return x+y}
var sum = (x,y) => x+y
var n2 = n => n*n
2. 函數(shù)的本質(zhì)
函數(shù):可以執(zhí)行代碼的對(duì)象就是函數(shù)。
函數(shù)調(diào)用:f.call(undefined,1,2)
從第二個(gè)開(kāi)始傳第一個(gè)參數(shù)
functionf(x,y){return x+y}
f.call(undefined,1,2) // 3
f.call(undefined,3,4) // 7
3. this 和 arguments
如何調(diào)用函數(shù)
f.call(asThis, input1,input2)
其中 asThis 會(huì)被當(dāng)做 this,[input1,input2] 會(huì)被當(dāng)做 arguments
禁止使用 f(input1, input2),因?yàn)閷W(xué)會(huì) .call 才能理解 this
function f(){
'use strict'
console.log(this)
console.log(arguments)
return undefined
}
f.call(1,2,3) // this 為 1,arguments 為 [2,3]
this: call 的第一個(gè)參數(shù)(undefined)

this.png
arguments:call 的后面的參數(shù)可以用arguments得到
4. Call Stack 和 遞歸

callStack1.png

call Stack2.png
5. 作用域 和 變量提升

作用域1.png
變量提升

變量提升1.png
作用域 與 變量提升的三大面試題
1 拿到題目,先變量提升
var a = 1;
function f1(){
alert(a) // 是多少
var a = 2
}
f1.call() //undefined
2
var a = 1;
function f1(){
var a = 2
f2.call()
};
function f2(){
console.log(a)
}
f1.call() //1
3
var liTags = document.querySelectorAll('li')
for(var i = 0; i<liTags.length; i++){
liTags[i].onclick = function(){
console.log(i) // 點(diǎn)擊第3個(gè) li 時(shí),打印 2 還是打印 6?
}
} //6