函數(shù)的5種聲明
1.具名函數(shù)
function f(x,y){
return x+y;
}
f.name // 'f'
console.log() 無論打印什么都返回undefined,打印什么跟返回什么無關(guān)。
2.匿名函數(shù)
var f;
f = function(x,y){
return x+y
}
f.name // 'f'
3.具名函數(shù)賦值()
var f;
f = function f2(x,y){ return x+y }
f.name // 'f2'
*console.log(f2) //由于不一致性千贯,顯示undefined
4.window.Function
var f = new Function('x','y','return x+y')
f.name // "anonymous"
5.箭頭函數(shù)(非正式命名)
var f = (x,y) => {
return x+y
}
var sum = (x,y) => x+y//只有一個return時坦刀,可以同時省去{}和return
var n2 = n => n*n//參數(shù)只有一個時避凝,可以省去()
函數(shù)的name屬性
每個函數(shù)都有一個name屬性,參見上述代碼。
特例
name屬性.png
函數(shù)的本質(zhì)
函數(shù) : 可以執(zhí)行代碼的對象
對象原型鏈
函數(shù)調(diào)用寫法:
- f()
- f.call(undefined,參數(shù)顽冶,參數(shù)...)
call與arguments
f.call(undefined,參數(shù)1售碳,參數(shù)2...)
1.上述代碼中undefined即為this强重,參數(shù)即為arguments。
2.call方法中第一個參數(shù)可以用this得到贸人。
3.call方法中第二個及以后的參數(shù)可以用arguments得到间景。
4.普通模式下,如果this是undefined艺智,打印出來的是window倘要;嚴(yán)格模式下則打印出相應(yīng)的this值。
function f(){
'use strict'
console.log(this)
console.log(arguments)
return undefined
}
f.call(1,2,3) // this 為 1十拣,arguments 為 [1,2,3]封拧,arguments是偽數(shù)組
作用域
定義:只要有一個函數(shù),就有一個作用域夭问。
函數(shù)作用域
函數(shù)作用范圍中泽西,變量不在子函數(shù)作用范圍內(nèi)時(即子函數(shù)未聲明此變量),則向其父函數(shù)中尋找甲喝;若父函數(shù)中也未聲明尝苇,則將此變量聲明為全局變量并賦值铛只。
面試題1:求紅色箭頭輸出值
求作用域1.png
答案:undefined
上述代碼等價于下述代碼:變量提升
作用域解答.png
面試題2:求紅色箭頭輸出值
函數(shù)作用域3.png
答案:1
解析:a=2只作用于f1范圍內(nèi),變量a要么在f4范圍內(nèi)糠溜,要么在其父函數(shù)范圍內(nèi)淳玩;f4內(nèi)沒有聲明變量a,擇其父函數(shù)——在本題中是全局變量非竿。
面試題2:在橫線處填寫代碼使其輸出2
作用域3
答案:a=2
解析:有a=2時蜕着,則輸出2;無a=2時红柱,則輸出1
注:函數(shù)作用域只規(guī)定了是哪個變量承匣,并未規(guī)定變量的取值。
面試題3:點擊紅線處時輸出值
必錯題.png
答案:6
解析:
面試題3.png
變量提升后初始值是0锤悄,for循環(huán)結(jié)束后i=6韧骗。
注:鼠標(biāo)點擊紅線處時,for循環(huán)已結(jié)束零聚。