亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

javascript中的閉包概念與用法實踐分析

2024-05-06 16:53:39
字體:
來源:轉載
供稿:網友

本文實例講述了javascript中的閉包概念與用法。分享給大家供大家參考,具體如下:

閉包的概念:閉包是指有權訪問另一個函數作用域中的變量的函數 (引自《javascript高級程序設計第三版》178頁)。閉包的優點是不會產生全局變量,避免變量污染問題,但是閉包也有一個缺點就是閉包攜帶包含它的函數作用域會比其它函數占用更多的內存,過度使用會導致內存占用過多。

wiki上關于閉包的概念:

In programming languages, closures (also lexical closures or function closures) are techniques for implementing lexically scoped name binding in languages with first-class functions. Operationally, a closure is a record storing a function[a] together with an environment:[1] a mapping associating each free variable of the function (variables that are used locally, but defined in an enclosing scope) with the value or reference to which the name was bound when the closure was created.[b] A closure—unlike a plain function—allows the function to access those captured variables through the closure's copies of their values or references, even when the function is invoked outside their scope.

簡單來說:閉包是一個存儲了函數以及與這個函數相關的環境信息的記錄。

閉包實踐一:初次體驗閉包

function a() { var temp = 100; function b() {  console.log(++temp); } return b;}var fn = a(); // 此時fn屬于全局的函數。fn();// 101fn();// 102

在函數a的內部return出了一個局部函數b。讓函數fn接收函數a的返回值,也就是函數b。連續執行了兩次fn,輸出結果101,,102表示,函數fn一直引用著函數a中的局部變量temp。每次調用fn,temp都會被自增1。從此處說明了函數a一直沒有被垃圾回收機制(GC)回收。以上代碼還可以這樣優化:

function a() { var temp = 100; return function() {  console.log(++temp); }}var fn = a();a = null;fn();// 101fn();// 102fn = null; // 調用完畢后要,要解除對內部匿名函數的引用,以便釋放內存

閉包實踐二:閉包與變量

分析下面的代碼

html結構:

<ul> <li>0</li> <li>1</li> <li>2</li></ul>

javascript結構:

var ul = document.querySelector('ul');// 為了演示方便,直接用html5的apivar lis = ul.children;for(var i=0; i< lis.length; i++) { lis[i].οnclick=function(){  console.log(i); }}

當點擊每個li時,輸出的全都是3,在點擊事件之前,for循環早已經執行完了,i的值為3。為了防止這種情況發生,for循環還可以修改成這樣:

for(var i=0; i< lis.length; i++) { lis[i].οnclick=function(num){  return function(){   console.log(num);  } }(i)}

由于函數是按值傳遞的,所以就會將變量i的當前值賦給num,而在函數內部又返回了一個訪問num的閉包。這樣每次i的值就保存下來了。值得一提的是在ECMAScript6中可以用嚴格模式下用let 來聲明i。這樣可以直接保存i,有關es6,以后再深入學習,示例代碼如下:

javascript結構:

'use strict'let ul = document.querySelector('ul');let lis = ul.children;for(let i=0; i< lis.length; i++) { lis[i].οnclick=function(){   console.log(i); }}

閉包實踐三:對實踐二的深層剖析,閉包保存的是整個變量對象,而不是某個特殊的變量。(出自 《javascript高級程序設計第三版》 181頁)

/* createFunctions方法返回一個函數數組 result */function createFunctions() { var result = new Array(); for(var i=0; i<10;i++) {  result[i] = function() {   return i;  } } return result;}var arr = createFunctions();// 我們拿到并輸出第一個數組元素函數的返回值var fn0 = arr[0];var varible0 = fn0();console.log(varible0); // 返回的是 10// 我們拿到并輸出第二個數組元素函數的返回值var fn1 = arr[1];var varible1 = fn1();console.log(varible1); // 返回的是 10// 可見閉包保存的是這個變量i對象,i的最終結果是10

我們只要對代碼稍稍優化,用自執行函數來處理,就可以達到我們的預期了,如下:

function createFunctions() { var result = new Array(); for(var i=0; i<10;i++) {  result[i] = (function(num) {   return function(){    return num;   }  })(i) } return result;}var arr = createFunctions();// 我們拿到并輸出第一個數組元素函數的返回值var fn0 = arr[0];var varible0 = fn0();console.log(varible0); // 返回的是 0// 我們拿到并輸出最后一個數組元素函數的返回值var fn9 = arr[9];var varible9 = fn9();console.log(varible9); // 返回的是 9

閉包實踐四:閉包與this  使用不同的編程方式使用閉包,this指向不同的對象

var color = 'black';var person = { color:"yellow", getColorFun1:function(){  return function(){   return this.color;  } }, getColorFun2:function(){  var that = this;  return that.color; }}console.log(person.getColorFun1()()); // 指向了 black (備注:fn()()這種寫法只限于非嚴格模式下)console.log(person.getColorFun2()); // 指向了yellow

說明:當調用到person.getColorFun1()的時候,在全局變量中生成一個函數function(){return this.color},此時的this指向是window,所以執行到person.getColorFun1()()的時候,color為window對象下的變量color為black

而在person.getColorFun2函數中用that保存了當前對象person,而在閉包函數里面return出去的color是person的color,所以執行完person.getColorFun2()()的時,color是yellow。

實踐四:閉包的高級應用

示例1:實現函數節流 

window.onresize = throttle(function(){  var width = window.innerWidth || document.documentElement.clientWidth;  console.log(width);},300); // 調節瀏覽器窗口,在松手后的0.3s后執行function throttle(fn,delay) {   var timer = null;   return function() {     clearTimeout(timer);     timer = setTimeout(fn,delay);   }}

示例2:實現封裝對象

var Person = (function(){ var haha = 0; // 這里表示可以定義一能夠使用到的參數 return function(name, age){  ++ haha; // 這里表示去使用定義到的參數,雖然在此處并沒有實際意義。  this.name = name;  this.age = age; };})();Person.prototype = { say : function(){  console.log(this.name + ' say hi'); }}var p1 = new Person('zhang san', 10);var p2 = new Person('li si', 20);console.log(p1.name); // zhang sanp1.say(); // zhang san say hip2.say(); // li si say hi

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


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品小视频| 亚洲乱码一区二区| 另类专区欧美制服同性| 久久夜色撩人精品| 久久精品视频免费播放| 久久久亚洲欧洲日产国码aⅴ| 伊人久久大香线蕉av一区二区| 美女精品久久久| 亚洲国产欧美在线成人app| 日韩综合视频在线观看| 亚州精品天堂中文字幕| 欧美视频在线观看免费| 欧美乱大交xxxxx另类电影| 日韩欧美在线视频免费观看| 成人黄色短视频在线观看| 欧美日韩国产丝袜另类| 色偷偷91综合久久噜噜| 97在线精品国自产拍中文| 欧美激情视频一区| 91精品国产色综合久久不卡98口| 亚洲片国产一区一级在线观看| 日韩成人在线播放| 欧美孕妇孕交黑巨大网站| 尤物九九久久国产精品的特点| 亚洲精品欧美一区二区三区| 国产一区二区三区高清在线观看| 日韩精品欧美国产精品忘忧草| 97婷婷涩涩精品一区| 亚洲综合成人婷婷小说| 日韩av电影手机在线观看| 久久99精品久久久久久青青91| 欧美大片免费观看在线观看网站推荐| 色综合男人天堂| 一个人看的www久久| 在线成人免费网站| 国产亚洲精品激情久久| 国产91精品青草社区| 亚洲免费视频网站| 亚洲性生活视频在线观看| 欧美黑人xxxⅹ高潮交| 性欧美xxxx视频在线观看| 福利视频第一区| 亚洲国产精品网站| 亚洲女人天堂视频| 欧美日韩成人网| www.日韩不卡电影av| 久久在线免费视频| 欧美中文字幕视频在线观看| 亚洲国产天堂久久综合| 国产精品青草久久久久福利99| 国产91精品黑色丝袜高跟鞋| 精品视频在线播放免| 欧美激情视频网站| 午夜精品免费视频| 国产欧美一区二区三区在线| 久久久av免费| 欧美午夜视频在线观看| 这里精品视频免费| 综合136福利视频在线| 美日韩在线视频| 国产69精品久久久久9999| 日韩视频免费在线观看| 精品国偷自产在线视频99| 欧美性猛交xxxx| 成人在线视频网| 欧美成人在线免费视频| 91在线观看免费高清完整版在线观看| 精品久久久在线观看| 国产综合香蕉五月婷在线| 日韩av电影中文字幕| 国产精品电影在线观看| 欧美成人免费全部观看天天性色| 91亚洲午夜在线| 日韩精品久久久久久久玫瑰园| 日韩高清人体午夜| 国产精品三级在线| 欧美有码在线观看视频| 成人欧美一区二区三区黑人| 欧美理论在线观看| 成人h片在线播放免费网站| 久久久久久国产免费| 午夜精品www| 亚洲欧美日韩高清| 一区二区三欧美| 不卡在线观看电视剧完整版| 最近2019中文字幕在线高清| 亚洲美女激情视频| 欧美激情a在线| 国产99视频在线观看| 国产精品9999| 欧美亚洲国产另类| 中文字幕日本欧美| 国产综合在线观看视频| 国产一区二区日韩精品欧美精品| 97久久精品国产| 亚洲第一综合天堂另类专| 在线视频日韩精品| 欧美香蕉大胸在线视频观看| 久久久久久久久久久网站| 国产中文字幕亚洲| 热草久综合在线| 日本道色综合久久影院| 日韩有码片在线观看| 国产98色在线| 26uuu亚洲伊人春色| 日韩欧美在线观看| 国外成人在线视频| 欧美精品日韩三级| 国产欧美精品在线播放| 欧美性受xxx| 91a在线视频| 亚洲高清免费观看高清完整版| 91免费看片网站| 欧美午夜久久久| 日韩在线精品一区| 久久久久久尹人网香蕉| 欧美大肥婆大肥bbbbb| 91综合免费在线| 久久国产精品偷| 青青草原成人在线视频| 久久久久久亚洲精品中文字幕| 国产精品video| 在线视频日韩精品| 日韩av一卡二卡| 欧美久久精品午夜青青大伊人| 一区二区福利视频| 亚洲欧美成人精品| 国产精品欧美亚洲777777| 91精品久久久久久久久青青| 精品视频偷偷看在线观看| 欧美专区在线播放| 欧美猛交ⅹxxx乱大交视频| 91高清视频免费观看| 欧美日韩美女在线| 久久国产精品亚洲| 97视频国产在线| 国产精品美女久久久免费| 在线播放日韩欧美| 亚洲日韩中文字幕在线播放| 久久久久久久久电影| 亚洲国产精彩中文乱码av| 欧美特黄级在线| 亚洲欧美国产制服动漫| 日韩电影免费观看中文字幕| 久久亚洲国产精品成人av秋霞| 欧美午夜丰满在线18影院| 久久久在线视频| 国产精品久久久久久av福利软件| 一区二区三区无码高清视频| 国产精品久久久久久一区二区| 久久人人爽人人爽人人片av高请| 成人精品视频99在线观看免费| 在线精品高清中文字幕| 91精品视频在线播放| 色在人av网站天堂精品| 一本色道久久综合狠狠躁篇怎么玩| 欧美激情视频在线免费观看 欧美视频免费一| 国产色婷婷国产综合在线理论片a| 欧美另类极品videosbestfree| 日韩一区二区av| 日韩精品有码在线观看| 97精品免费视频| 国产成人精品久久二区二区| 亚洲999一在线观看www|