如何快速判斷是不是閉包

l129發表於2019-03-06

如何快速判斷是不是閉包?

閉包有如下三個特點

1.閉包一定有巢狀函式
2.內層函式一定操作了外層函式的區域性變數
3.外層函式一檔將內層函式返回外部,並且被全域性變數儲存
複製程式碼

在做關於閉包的題時,記住一下兩個原則

1.外層函式被多次呼叫,都會建立新的作用域。也就是說內層函式操作的外層函式的區域性變數相互之間是不會影響的
2.外層函式返回的內層函式被呼叫幾次,內層函式操作的外層函式的區域性變數就變化幾次
例:
    function outer() { 
        var i = 0;
        return function(){
            return i++
        }
     }
     var getNum=outer()//外層函式第一次被呼叫
     console.log(getNum())//0
     console.log(getNum())//1
     var getNum1=outer()//外層函式第二次被呼叫,建立新的作用域,和第一次被呼叫中的i互不影響
     console.log(getNum1())//0
     console.log(getNum1())//1
     console.log(getNum1())//2
     console.log(getNum1())//3
 下面的例子不是閉包,因為外層函式返回的內層函式傳入了形參i
     function outer() { 
        var i = 0;
        return function(i){
            return i++
        }
     }
     var getNum=outer()//外層函式第一次被呼叫
     console.log(getNum())//NaN
     console.log(getNum())//NaN
     var getNum1=outer()//外層函式第二次被呼叫,建立新的作用域,和第一次被呼叫中的i互不影響
     console.log(getNum1())//NaN
     console.log(getNum1())//NaN
     console.log(getNum1())//NaN
     console.log(getNum1())//NaN
    
    function outer() { 
    var arr = []
    for(var i=0;i<3;i++){
         arr.push(function () { return i })
       }
        return arr
     }
     var getFunction = outer()
     console.log(getFunction[0]())//3
     console.log(getFunction[1]())//3
     console.log(getFunction[2]())//3
複製程式碼

相關文章