js中函數作用域,作用域鏈,變量提升
阿新 • • 發佈:2019-02-25
pre 實參 取反 出錯 第三題 無法訪問 調用 聲明變量 相互
先來分析幾個容易出錯的題目
第一題:
var foo = 1 function bar(){ if(!foo){ var foo = 10; } console.log(foo) } bar()
這道題大家會誤認為是1
其實在內部函數執行時,無論這個判斷是否成立,都會對聲明變量進行提升,所以var foo = undefined,所以在內部判斷,因為undefined是false,取反就是true,執行var foo = 10,所以:
最後答案就是10
第二題:
var n = 0 function a(){ var n = 10 function b(){ n++ console.log(n) } b() return b } var c = a() c() console.log(n)
我直接敘述解題步驟了:
先聲明變量,函數聲明提前,執行a()函數,在a函數裏又聲明了函數b,調用函數b並且將b返回,n++將函數a裏的n的值變為11,打印n,所以第一個n是11,
這時候將函數b返回,並且執行,因為這時還是在函數a內部執行,n已經是11,再n++,所以n = 12,
最後一個是n是0,函數的私有作用域無法訪問
所以最終結果是11,12,0
第三題:
var a = 4 function b(x,y,a){ console.log(a) arguments[2] = 10 console.log(a) } a= b(1,2,3) console.log(a)
在js的非嚴格模式下:函數的實參集合與形參變量存在‘映射關系’,不管其中誰改變了,另外一個都會跟著改變
在js的嚴格模式下:arguments實參集合和形參變量的映射關系被切斷了,相互之間互不幹擾
如果沒有返回值則是undefined
所以結果是3,10,undefined
js中函數作用域,作用域鏈,變量提升