js中閉包的定義是什嗎?js閉包的應用情境

來源:互聯網
上載者:User
本篇文章給大家帶來的內容是關於js中閉包的定義是什嗎?js閉包的應用情境,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所協助。

什麼是閉包

閉包是指有權訪問另一個函數範圍中的變數的函數。

function createFunc() {    var name = "wheeler";    return function () {        return name;    }}var nameFunc = createFunc();  // nameFunc是一個閉包var name = nameFunc();console.log(name);// 解除對匿名函數的應用(以便釋放記憶體)nameFunc=null;

內建函式可以訪問外部函數的變數name,內建函式的範圍包含了外部函數的範圍
(由於閉包會攜帶包含它的函數的範圍,可能導致記憶體佔用過多,因此謹慎使用閉包)

可以通過模仿塊級範圍減少閉包導致的記憶體佔用過多

// 塊級範圍(通常稱為私人範圍)的匿名函數的文法(function(){    // 塊級範圍})();

將閉包定義在塊級範圍裡面

// 可以減少閉包佔用的記憶體問題,因為沒有指向匿名函數的引用。只要函數執行畢,就可以立即銷毀其範圍鏈了(function(){    function createFunc() {        var name = "wheeler";        return function () {            return name;        }    }    var nameFunc = createFunc();    var name = nameFunc();    console.log(name);})();

閉包的應用情境

  • 用閉包類比私人方法

var returnNum = (function () {    var num = 0;    function changeNum(value) {        num = value;    }    return {        add: function () {            changeNum(10);        },        delete: function () {            changeNum(-10);        },        getNum: function () {            return num;        }    }})();// 閉包console.log(returnNum.getNum());returnNum.add();console.log(returnNum.getNum());returnNum.delete();console.log(returnNum.getNum());
  • 緩衝

var CacheCount = (function () {    var cache = {};    return {        getCache: function (key) {            if (key in cache) {// 如果結果在緩衝中                return cache[key];// 直接返回緩衝中的對象            }            var newValue = getNewValue(key); // 外部方法,擷取緩衝            cache[key] = newValue;// 更新緩衝            return newValue;        }    };})();console.log(CacheCount.getCache("key1"));
  • 封裝

var person = function(){    var name = "default";//變數範圍為函數內部,外部無法訪問    return {        getName : function(){            return name;        },        setName : function(newName){            name = newName;        }    }}();console.log(person.name);// undefinedconsole.log(person.getName());person.setName("wheeler");console.log(person.getName());
  • setTimeout

function func(param) {    return function() {        console.log(param);    }}var myFunc = func('wheeler');setTimeout(myFunc, 1000);
  • 保護函數內的變數安全。

  • 在記憶體中維持一個變數。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.