溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JavaScript閉包的案例分析

發(fā)布時間:2020-12-03 09:53:44 來源:億速云 閱讀:139 作者:小新 欄目:web開發(fā)

這篇文章將為大家詳細講解有關(guān)JavaScript閉包的案例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)。創(chuàng)建閉包的常見方式,就是在一個函數(shù)內(nèi)部創(chuàng)建另一個函數(shù)。了解閉包前首先需要了解變量作用域

變量作用域:全局變量和局部變量
1、全局變量
直接定義在全局作用域的變量

var name='Fakin';
function getName(){
  alert(name)
}
getName()//'Fakin'

而函數(shù)可以直接讀取全局變量

2、局部變量
直接定義在函數(shù)內(nèi)部的變量(在ES6之前JS是沒有塊級作用域的。)

function getName(){
  var name='Fakin';
}
alert(name)//undefined

閉包
搞清楚了這兩個東西后咱們在來看下閉包是什么回事!

問題1:閉包是個啥玩意,上面說了一堆,我看不懂?。?br/>答:閉包個人理解就是能讀取其他函數(shù)內(nèi)部變量的函數(shù)

問題2:閉包怎么用
答:在一個函數(shù)的內(nèi)部在創(chuàng)建一個函數(shù),在這個函數(shù)中引用上一函數(shù)的變量,最后講這個函數(shù)返回即可,是不是很繞,下面給例子

function f1(){
    var n=999;
    nAdd=function(){n+=1}
    function f2(){
      alert(n);
    }
    return f2;
  }
  var result=f1();
  result(); // 999
  nAdd();
  result(); // 1000

如上例子中 f2就是閉包函數(shù),在f1中返回函數(shù)f2,最后把f1賦值給result,result一共運行了兩次,結(jié)果也得出了咱們想要的,也就證明了,在閉包中f2引用了f1的變量‘n’而‘n’沒有因為f1執(zhí)行完畢后然后在內(nèi)存中銷毀,大家應(yīng)該知道,在JS中如果一個變量在函數(shù)執(zhí)行完后沒有被其他地方給引用的話,是就自動銷毀的。

使用閉包需要注意的地方

1:由于閉包會使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存使用很大,會造成渲染卡頓等等,瀏覽器運行慢,在IE瀏覽器中還會造成內(nèi)存泄露等問題
2:由于在閉包中子函數(shù)引用父函數(shù)的變量,子函數(shù)會修改父函數(shù)變量,請不要隨意修改父函數(shù)變量的值

思考題

function count() {
    var arr = [];
    for (var i=1; i<=3; i++) {
        arr.push(function () {
            return i * i;
        });
    }
    return arr;
}

var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];
f1(); // 16
f2(); // 16
f3(); // 16

為什么f1 f2 f3都返回的是同一個值,而不是我們想要的呢?那怎么能不能閉包來解決呢?
其實也很簡單,咱們閉包多兩行代碼就行

function count() {
    var arr = [];
    for (var i=1; i<=3; i++) {
        arr.push((function (n) {
            return function () {
                return n * n;
            }
        })(i));
       //在自執(zhí)行函數(shù)中把i傳入相當(dāng)于這個自執(zhí)行函數(shù)的參數(shù)綁定了i,
       //當(dāng)每次循環(huán)的時候不管變量怎么更改,這個函數(shù)的參數(shù)不會更改,所以返回咱們想要的結(jié)果
    }
    return arr;
}

var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];

f1(); // 1
f2(); // 4
f3(); // 9

關(guān)于JavaScript閉包的案例分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI