国产探花免费观看_亚洲丰满少妇自慰呻吟_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帶有私有數據遞歸中,為什么性能低?因為重復的太多了,將已經計算好的存儲起來,如果沒有計算,就遞歸,但是算完以后還是存起來。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南靖县| 寻乌县| 封丘县| 柘荣县| 麦盖提县| 德化县| 拉孜县| 娱乐| 古丈县| 伊吾县| 桃江县| 固原市| 泾源县| 佛冈县| 长岛县| 牡丹江市| 洛川县| 四平市| 栾城县| 成武县| 崇礼县| 盐亭县| 磴口县| 昭通市| 安庆市| 吉木萨尔县| 丹寨县| 金昌市| 天峻县| 湖口县| 荔浦县| 云梦县| 乐都县| 平顺县| 平陆县| 琼海市| 镇赉县| 鸡西市| 丹阳市| 上饶县| 孝感市|