日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JavaScript進階(三)閉包原理與用法詳解

瀏覽:162日期:2023-10-29 10:43:29

本文實例講述了JavaScript閉包原理與用法。分享給大家供大家參考,具體如下:

為了更好的理解,在閱讀此文之前建議先閱讀上一篇《JavaScript詞法作用域與作用域鏈》 1.什么是閉包

閉包的含義就是閉合,包起來,簡單的來說,就是一個具有封閉功能與包裹功能的結構。所謂的閉包就是一個具有封閉的對外不公開的,包裹結構,或空間。

在JS中函數構成閉包。一般函數是一個代碼結構的封閉結構,即包裹的特性,同時根據作用域規則只允許函數訪問外部的數據,外部無法訪問函數內部的數據,即封閉的對外不公開的特性,因此說函數可以構成閉包。

概括:閉包就是一個具有封閉與包裹功能的結構。函數可以構成閉包。函數內部定義的數據函數外部無法訪問,即函數具有封閉性;函數可以封裝代碼即具有包裹性,所以函數可以構成閉包。2.閉包有什么用(解決什么問題)? 閉包不允許外部訪問 要解決的問題就是間接訪問該數據

函數就可以構成閉包,要解決的問題就是如何訪問到函數內部的數據

function foo () { var num = 123; return num;}var res = foo();console.log( res ); // =>123

這里的確是訪問到函數中的數據了。但是該數據不能第二次訪問,因此第二次訪問的時候又要調用一次foo,表示又有一個新的num = 123出來了。

在函數內的數據,不能直接在函數外部訪問,那么在函數內如果定義一個函數,那么在這個函數內部中是可以直接訪問的

function foo() { var num = Math.random(); function func() { return mun; } return func;}var f = foo();// f 可以直接訪問這個 numvar res1 = f();var res2 = f();

我們使用前面學習的繪制作用域鏈結構圖的方法來繪制閉包的作用域鏈結構圖,如下:

JavaScript進階(三)閉包原理與用法詳解

3.閉包使用舉例

如何獲得超過一個數據

function foo () { var num1 = Math.random(); var num2 = Math.random(); return { num1: function () { return num1; }, num2: function () { return num2; } }}

如何完成讀取一個數據和修改這個數據

function foo () { var num = Math.random(); return { get_num : function () { return num; }, set_num: function( value ) { return num = value; } }}4.基本的閉包結構

一般閉包的問題就是要想辦法簡潔的獲取函數內的數據使用權,那么我們就可以總結出一個基本的使用模型。

寫一個函數,函數內部定義一個新函數,返回新函數,用新函數獲得函數內的數據 寫一個函數,函數內部定義個一個對象,對象中綁定多個函數(方法),返回對象,利用對象的方法訪問函數內的數據5.閉包的基本用法

閉包是為了實現具有私有訪問空間的函數的

帶有私有訪問數據的對象

function Person() { this.name = '張三'; // setName( ’’ )}

所有的私有數據,就是說只有函數內部可以訪問的數據,或對象內部的方法可以訪問的數據

最簡單的實現:

function createPerson() { var __name__ = ''; return { getName: function () { return __name__; }, setName: function( value ) { // 如果不姓張就報錯 if ( value.charAt(0) === ’張’ ) { __name__ = value; } else { throw new Error( ’姓氏不對,不能取名’ ); } } }}var p = createPerson();p.set_Name( ’張三豐’ );console.log( p.get_Name() );p.set_Name( ’張王富貴’ );console.log( p.get_Name() );

帶有私有數據的函數

var func = function () {}function func () {}var foo = (function () { // 私有數據 return function () { // 可以使用私有的數據 ... };});6.閉包基本模型

對象模型

function foo () { // 私有數據 return { method : function(){ // 操作私有數據 } }}

函數模型

function foo(){ // 私有數據 return function(){ // 可以操作私有數據 }}7.沙箱模式(閉包應用的一個典范)7.1 沙箱的概念

沙盤與盒子,就可以在一個笑笑的空間內模擬顯示世界,特點是執行效果與現實世界一模一樣,但是在沙箱中模擬與現實無關.

7.2 沙箱模式

沙箱模式就是一個自調用函數,代碼寫到函數中一樣會執行,但是不會與外界有任何的影響

例如,在jQuery中

(function () { var jQuery = function () { // 所有的算法 } // .... // .... jQuery.each = function () {} window.jQuery = window.$ = jQuery;})();$.each( ... )8.帶有緩存功能的函數

以 Fibonacci 數列為例,改進傳統計算斐波那契數列方法 我們來回顧一下傳統遞歸方式求斐波那契數列方法,我們定義一個count變量來查看遞歸了多少次:

var count = 0;function fibo( n ){ count++; if( n ==0 || n == 1 ) return 1; return fibo( n - 1 ) + fibo( n - 2 );}fib1( 20 );console.log( count1 );// 5: 15// 6: 25// ...// 20: 21891

當 n = 5 式,count = 15,當時當 n = 20 的時候,count就達到驚人的21891次,性能太低了

性能低的原因是 重復計算。如果每次將計算的結果存起來

那么每次需要的時候先看看有沒有存儲過該數據,如果有,直接拿來用。 如果沒有再遞歸,但是計算的結果需要再次存儲起來,以便下次使用

改進版:

var data = [ 1, 1 ];var count = 0;function fibo( n ) { count++; var v = data[ n ]; if( v === undefined ){ v = fibo( n - 1 ) + fibo( n - 2 ); data[ n ] = v; } return v;}fibo( 100 );console.log( count ); // 199

改進之后, n = 100的時候也才199次,大大提高了性能。

9.閉包的性能問題

函數執行需要內存,那么函數中定義的變量,會在函數執行結束后自動回收,凡是因為閉包結構的,被引出的數據,如果還有變量引用這些數據的話,那么這些數據就不會被回收。

因此在使用閉包的時候如果不適用某學數據了,一定要賦值一個null

var f = (function () { var num = 123; return function () { return num; };})();// f 引用著函數,函數引用著變量num// 因此在不適用該數據的時候,最好寫上f = null;

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。

更多關于JavaScript相關內容可查看本站專題:《JavaScript常用函數技巧匯總》、《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》及《JavaScript數學運算用法總結》

希望本文所述對大家JavaScript程序設計有所幫助。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美中文一区二区| 日韩欧美一区二区三区在线视频| 国产色99精品9i| 亚洲深深色噜噜狠狠爱网站 | 欧美成a人国产精品高清乱码在线观看片在线观看久 | 亚洲中午字幕| 久久精品青草| 91亚洲国产| 国产精品xxx在线观看| 国产一卡不卡| 日韩激情精品| 国产美女视频一区二区| 国产精品一卡| 精品伊人久久久| 国产精品原创| 久久九九电影| 亚洲一区导航| 久久激情五月婷婷| 韩国一区二区三区视频| 午夜欧美巨大性欧美巨大| 欧美va亚洲va日韩∨a综合色| 高清一区二区三区av| 成人午夜亚洲| 日韩一区二区在线免费| 日韩午夜一区| 国产精品4hu.www| 四虎4545www国产精品| 久久午夜影视| 高清久久一区| 亚洲精品美女91| 亚洲天堂一区二区| 青草国产精品| 亚洲成人精选| 精品国产美女a久久9999| 亚洲香蕉网站| 成人精品久久| 婷婷成人av| 亚洲午夜视频| 国产精品网站在线看| 99视频一区| 国产一区二区三区四区二区| 久久婷婷一区| 国产亚洲亚洲| 国产精品久久久久久久久久白浆 | 久久婷婷亚洲| 亚洲一区二区日韩| 久久精品亚洲| 日韩一区二区免费看| 国产精品一区二区三区四区在线观看 | 日韩欧美中文| 日韩av一二三| 国产一区日韩欧美| 丝袜亚洲精品中文字幕一区| 久久精品国语| 欧美黑人做爰爽爽爽| 国产综合婷婷| 国产精品sm| 99视频+国产日韩欧美| 精品国产亚洲日本| 亚洲综合国产| 国产精品久久久久77777丨| 99国产精品免费视频观看| 国产精品久久久久久久久免费高清| 午夜av成人| 国产精品一区二区三区美女 | 日韩精品1区2区3区| 日韩不卡免费高清视频| 国产精品tv| 日本一区中文字幕| 欧美精品一卡| 国产一区二区精品久| 国产一区成人| 激情欧美亚洲| 老牛影视精品| 高清精品久久| 韩国女主播一区二区三区| 国产免费av国片精品草莓男男| 国产视频欧美| 久久99伊人| 石原莉奈在线亚洲三区| 亚洲少妇在线| 麻豆91精品| 欧美不卡高清| 日本欧美韩国一区三区| 日韩欧美中文字幕一区二区三区 | 蜜桃视频第一区免费观看| 午夜欧美精品| 视频一区二区中文字幕| 每日更新成人在线视频| 中文字幕乱码亚洲无线精品一区| 亚洲专区在线| 日韩在线网址| 欧美黄页在线免费观看 | 日韩在线黄色| 日韩精品视频一区二区三区| 亚洲精品在线a| 日本成人中文字幕| 精品国产亚洲一区二区在线观看| 久久精品网址| 欧美日中文字幕| 亚洲字幕久久| 久久69成人| 亚洲黄色中文字幕| 亚洲精品一级| av日韩中文| 免费视频一区二区| 国产精品1区| 国精品一区二区| 热久久久久久| 电影91久久久| 91精品电影| 欧美黑人做爰爽爽爽| 不卡av一区二区| 欧美精品不卡| 亚洲欧美伊人| 国产黄色一区| 日韩中文字幕区一区有砖一区| 国产精品mv在线观看| 女人天堂亚洲aⅴ在线观看| 国产日韩欧美中文在线| 亚洲一级特黄| 久久一区精品| 日韩有吗在线观看| 久久久久国产| 91麻豆国产自产在线观看亚洲| 香蕉视频成人在线观看| 高清一区二区| 欧美日韩在线精品一区二区三区激情综合| 国产精品巨作av| 欧美视频二区| 久久亚洲色图| 欧美二区视频| 精品国产免费人成网站| 婷婷精品久久久久久久久久不卡| 激情偷拍久久| 91精品一区二区三区综合| 麻豆91小视频| 国产精品毛片视频| 亚洲精品网址| 极品日韩av| 久久99精品久久久野外观看| 国产精品一线天粉嫩av| 日本久久一区| 日本精品国产| 国产美女视频一区二区| 国产伦精品一区二区三区千人斩 | 午夜性色一区二区三区免费视频| 国产91精品对白在线播放| 欧美成人aaa| 精品视频久久| 久久影院资源站| 综合日韩av| 成人午夜毛片| 欧美一区二区性| 欧美一级专区| 欧美一级久久| 久久久91麻豆精品国产一区| 国产精品一区二区精品 | 日韩免费精品| 国产欧美69| 国产一区二区三区亚洲综合| 国产剧情在线观看一区| 国产精品传媒麻豆hd| 久久影院资源站| 欧美男人天堂| 夜夜精品视频| 日本aⅴ免费视频一区二区三区| 国产精品美女久久久| 久久av影院| 久久麻豆精品| 视频一区二区三区中文字幕| 国产欧美日韩影院| 免费在线小视频| 亚洲三级网站| 久久精品国产久精国产爱| 国产主播一区| 香蕉久久一区| 在线看片国产福利你懂的| 视频一区中文字幕| 国产精品一页| 日本在线一区二区三区| 四虎4545www国产精品| 亚洲人妖在线| 亚洲国内欧美| 国产精品115| 久久精品欧美一区| 久久精品av麻豆的观看方式| 久久婷婷亚洲| 国产精品不卡| 日韩精品欧美大片| 美女网站一区| 麻豆中文一区二区| 亚洲性视频在线| 日韩在线播放一区二区| 国产精品99视频| 日韩欧美久久| 国产日韩在线观看视频| 蜜臀va亚洲va欧美va天堂 | 欧美丝袜一区| 亚洲天堂资源|