Web | JavaScript的閉包
阿新 • • 發佈:2018-12-20
自己 能夠 進行 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的閉包