国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript 自執行函數(閉包)

2019-11-06 06:03:03
字體:
來源:轉載
供稿:網友

1. 全局污染

在變量聲明的時候有一個規則:重復聲明無效var num = 123;var num = 'abc';重復聲明的代碼不會報任何錯誤,但是其聲明特征就沒有了,會轉換成普通賦值語句故,上述代碼與下面代碼等價var num = 123;num = 'abc';例:
<script src="jquery.js"></script><script>    var $ = function(selector){        return document.querySelectorAll(selector);//給$重新賦值了    };    $('div').CSS(...);//報錯,此時$('div')是nodeList類型,沒有css方法</script>

2. 閉包

起因:在函數內部聲明的數據,在函數外是不能夠直接訪問的。閉包含義:就是包裹、包裝的意思。閉表示封閉,即不可訪問。    所謂的閉包就是一個具有封閉的特性,同時具有包裹的特性的一種結構。    從代碼的角度說,所謂的閉包就是函數。① 函數內聲明的變量,外界無法訪問,即封閉性。② 函數本身又是一個封裝單位,利用函數可以封裝代碼,因此一個函數也是一個包裹結構。因此函數既有包裹的特性,也有封閉的特性,因此可以直接稱呼函數為閉包 (closure)凡是函數要執行,就會分配內存空間以供函數執行如果函數執行結束,內存會被釋放,即可以重復使用這個定義是有缺陷的。如果函數內部將數據的引用返回到外部,那么就可以保證數據被一直占用。
function foo(){    var num = 123;    function func(){        return num;    }    return func;}var f = foo(); // f指向func,foo不可以被釋放,因為func// num不能被釋放,因為f會返回該數據

3. 所謂的閉包就是函數,其特點是函數內定義的變量,在函數外是無法訪問的。

但是閉包需要解決的問題是如何間接的訪問到這些數據。如何訪問函數中的數據?① 最簡單的訪問方式:返回
function foo(){var num = 123;return num;}var res1 = foo();var res2 = foo();//但兩次訪問的并不是同一個數據② 多次訪問,f 只允許調用一次
var res1 = foo();var res2 = res1;③ 使得函數返回一個函數,利用函數返回數據
function f(){var num = 123;return function(){        //作用域訪問規則,是可以訪問num的    return num;    };}var foo = f();//先執行,只調用了一次var res1 = foo();//獲取num的值var res2 = foo();//訪問的是同一個值將2級鏈返回到0級鏈中,利用2級鏈可以訪問1級鏈的特性,使得0級鏈間接的訪問到1級鏈。因此這個數據是不能被銷毀的,即不能被釋放。小結:所謂的閉包,就是一個函數,因為函數中聲明的變量,外界無法訪問,函數就構成了封閉結構,因此成為閉包。同時如果需要訪問函數中的數據,可以考慮利用函數返回一個函數,使用返回的函數操作函數內的數據,以使得函數外可以通過這個函數內返回的函數,訪問內部的數據。4. 補充:內存釋放在 js 中凡是不被使用的數據,可以被釋放

5. 閉包的用法

(1)作為沙箱模式

沙箱:就是一個獨立的與外界隔離的運行環境(function)
(function(){    //此處的代碼,對外隔離,外界無法訪問,但是可以執行})();暴露方式:
var foo = (function(){function foo(){}    return foo;})();

(2)帶有緩存功能的函數

var func = (function(){    //私有數據    return function foo(){    };})();//func帶有私有數據遞歸中,為什么性能低?因為重復的太多了,將已經計算好的存儲起來,如果沒有計算,就遞歸,但是算完以后還是存起來。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新乡县| 西乌珠穆沁旗| 青河县| 杂多县| 石棉县| 安远县| 肥西县| 连城县| 乡城县| 姚安县| 吉隆县| 娄烦县| 卫辉市| 兴化市| 都兰县| 泸水县| 苏尼特左旗| 博爱县| 通河县| 垫江县| 九江县| 疏勒县| 益阳市| 克东县| 池州市| 博野县| 徐州市| 武城县| 北海市| 察雅县| 上思县| 平阳县| 西藏| 托克逊县| 永平县| 铁岭市| 黄冈市| 灵台县| 山西省| 亳州市| 山西省|