談談 ,閉包 , 作用域
閉包是Javascript語言的一個難點,也是它的特色,很多高級應用都要依靠閉包實現。
談到閉包,我們先談談作用域
在 js 中作用域無外乎兩種:
1,全局作用域;在JavaScript中全局變量的作用域比較簡單,它的作用域是全局的,在代碼的任何地方都是有定義的。
2,局部作用域;也可以理解為函數作用域;JavaScript的函數作用域是指在函數內聲明的所有變量在函數體內始終是可見的;而對函數體外不可見。另外局部變量的優先級要高於同名的全局變量,也就是說當局部變量與全局變量重名時,局部變量會覆蓋全局變量。
上邊我們說了作用域,那么實際開發中,出於種種原因,我們有時候需要得到函數內的局部變量;理論上函數體內部的變量,在函數外是沒有辦法訪問到的,怎么解決呢 ? 那就是在函數的內部,再定義一個函數 => 閉包
什么是閉包 ?
“官方”的解釋是:所謂“閉包”,指的是一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分;
通俗的講:就是函數a的內部函數b,被函數a外部的一個變量引用的時候,就創建了一個閉包.
我的理解: 閉包就是能夠讀取其他函數內部變量的函數。
在Javascript語言中,只有函數內部的子函數才能讀取局部變量,因此可以把閉包簡單理解成"定義在一個函數內部的函數"。
所以,在本質上,閉包就是將函數內部和函數外部連接起來的一座橋梁。
閉包的用途
1,在外部讀取函數內部的變量
2,讓這些變量始終保存在內存中(變相的儲存)
我們來實現一個閉包的例子 :
function f1(){ var n=999; function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999
閉包的優缺點
優點就不用多說了,可以訪問函數內部的變量,並且不受污染,始終保存在內存中
缺點就是閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成頁面的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部清除
最后來砍一刀, 阮一峰老師的思考題,大家答對了嘛 ?
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ var that = this; return function(){ return that.name; }; } }; alert(object.getNameFunc()()); // My Object