1. 程式人生 > >js中函數作用域,作用域鏈,變量提升

js中函數作用域,作用域鏈,變量提升

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中函數作用域,作用域鏈,變量提升