1. 程式人生 > >Web | JavaScript的閉包

Web | JavaScript的閉包

自己 能夠 進行 name his 生命 defined ava def

閉包

function outter(){
    var a = 1;
    function inner(){
        console.log(a);
    }
    return inner;
}
//進行函數調用
var inner = outter();
inner();

以上代碼是最基本的閉包的形成.當outter函數開始調用的時候,它內部就形成了一個閉包,這個閉包存在使用了outter函數的a變量的inner函數的作用域中.所以當inner函數調用的時候,才能夠仍然訪問到outter函數的a變量.

所以可以看到閉包的一些特性.

閉包的形成:當外部函數的執行上下文被啟動的時候,或者說是外部函數被調用的時候

閉包的位置: 閉包存放在內部函數的作用域中,名稱為closure.

閉包的作用:能夠讓內部函數在外依然能夠訪問到外部函數的變量,延長了該變量的生命周期.

閉包的形成條件: 函數內裏嵌套函數,並且內函數使用到了外部函數的變量.

閉包的釋放: 閉包不會主動銷毀,會造成輕微的內存泄露.可以自己選擇主動的對內部方法進行釋放,置為null.

那麽閉包在JS中有何作用,我覺得閉包很大的作用在於彌補了JS語言的一些數據私密性的缺陷.

在JS中,沒有類的概念,一切以函數為尊.而函數內部的一些屬性和方法保證了一些權限,不可訪問.那麽這個時候閉包的作用就顯現出來的.有點相當於其他語言中,構造了一些私有的屬性和方法,然後提供了一個公開的接口以供訪問調用,然後可以保證一些安全性.

在JS中,通過提供返回的一個函數內部方法,暴露一些可以公開的變量或者方法讓人進行訪問.

function Person(){
    var name = "Jan";
    // 名字可以公開,但是年紀不能公開
    var age = 18;
    function about(){
        console.log('我的名字是'+this.name);
    }
    return about;
}

閉包相關面試題

function fun(n, o) {
    console.log(o)
    return {
      fun: function (m) {
        return fun(m, n)
      }
    }
  }
  var a = fun(0)
  a.fun(1)  // -- var b = fun(1,0)
  a.fun(2) // var c = fun(2,0);
  a.fun(3) //  var d  = fun(3,0)
  // undefined,0,0,0

  var b = fun(0).fun(1).fun(2).fun(3) //undefined,0,1,2

  var c = fun(0).fun(1)
  c.fun(2)
  c.fun(3) //undefined,0,1,1

Web | JavaScript的閉包