當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
JS闭包问题(一)
之前我寫過一篇JavaScript原型與原型鏈的文章,此屬于JS中的重難點。
而閉包,是JS中除了原型鏈之外又一個重點和難點。
一、何為閉包
所謂“閉包”,指的是一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。
以上是比較官方的解釋,但是感覺晦澀難懂(反正我是沒怎么看懂),按照我的理解其實就是函數,具體點就是在函數內部定義的函數,但是就只是這么一說也太不負責任了,我們還是具體以實例來簡單理解閉包吧。
function a(n,m){var bb = 10;return function(){ // 閉包console.log(bb); // 10return n+m;} } var sum = a(1,2)(); console.log(sum); // 3上面這個例子中,a()函數中返回的這個匿名函數就是閉包,而閉包的一個作用就是能夠訪問外部包含它的函數內的變量。
二、閉包與變量問題
function createFunction(){var result = [];for(var i=0; i < 10; i++){result[i] = function(){return i;};}return result; }表面上看這個函數沒有什么問題,應該可以正確地返回一個包含10個函數的數組,而每個函數都會返回自己的索引值。然而實際上并不是這樣的,實際上所有閉包的返回結果都是10。
console.log(createFunction()[0]()); // 10 console.log(createFunction()[9]()); // 10這是因為閉包只能取得包含函數中任何變量的最后一個值,那如果要實現上面返回相應索引值應該怎么修改呢?
三、如何解決問題
① 使用立即執行的匿名函數
修改后的代碼如下:
function createFunction() {var result = [];for(var i = 0; i < 10; i++) {result[i] = function(num) {return function() {return num;};}(i);}return result; }console.log(createFunction()[0]()); // 0 console.log(createFunction()[9]()); // 9修改后的代碼使用了一個立即執行匿名函數,這個匿名函數能夠在每個循環中獲取相應的變量i并作為其參數傳遞給num并立即執行函數,那么最終返回的那個num變量自然就是遞增的 i。
② 使用ES6中的let關鍵字來定義變量 i
修改后的代碼如下:
function createFunction(){var result = [];for(let i = 0; i < 10; i++){result[i] = function(){return i;};}return result; }此方法雖然簡單,但是目前瀏覽器對ES6語法兼容性并不好,所以還是建議使用方法①。
結束語: 本人對于JS閉包理解其實也并不是很透徹,如果有不足之處,還請多多指正,謝謝!
總結
- 上一篇: Behavioral模式之Memento
- 下一篇: YII2框架的excel表格导出