最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2019年07月26日 12:01:10   作者:Johnny丶me  
這篇文章主要介紹了javascript中的閉包概念與用法,結(jié)合具體實例形式分析了javascript閉包的概念、原理、使用方法及相關操作注意事項,需要的朋友可以參考下

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

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

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.

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

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

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

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

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

閉包實踐二:閉包與變量

分析下面的代碼

html結(jié)構(gòu):

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

javascript結(jié)構(gòu):

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

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

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

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

javascript結(jié)構(gòu):

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

我們只要對代碼稍稍優(yōu)化,用自執(zhí)行函數(shù)來處理,就可以達到我們的預期了,如下:

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();
// 我們拿到并輸出第一個數(shù)組元素函數(shù)的返回值
var fn0 = arr[0];
var varible0 = fn0();
console.log(varible0); // 返回的是 0
// 我們拿到并輸出最后一個數(shù)組元素函數(shù)的返回值
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

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

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

實踐四:閉包的高級應用

示例1:實現(xiàn)函數(shù)節(jié)流 

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

示例2:實現(xiàn)封裝對象

var Person = (function(){
 var haha = 0; // 這里表示可以定義一能夠使用到的參數(shù)
 return function(name, age){
  ++ haha; // 這里表示去使用定義到的參數(shù),雖然在此處并沒有實際意義。
  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 san
p1.say(); // zhang san say hi
p2.say(); // li si say hi

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

更多關于JavaScript相關內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學運算用法總結(jié)

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

相關文章

  • js+canvas實現(xiàn)五子棋小游戲

    js+canvas實現(xiàn)五子棋小游戲

    這篇文章主要為大家詳細介紹了js+canvas實現(xiàn)五子棋小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 詳解JavaScript是如何驗證URL的

    詳解JavaScript是如何驗證URL的

    當開發(fā)者需要為不同目的以不同形式處理URL時,我們經(jīng)常會借助于JavaScript。本文就為大家整理了JavaScript驗證URL的方法,希望對大家有所幫助
    2023-02-02
  • BootStrap 附加導航組件

    BootStrap 附加導航組件

    Bootstrap 是一個用于快速開發(fā) Web 應用程序和網(wǎng)站的前端框架,主要基于 HTML、CSS、JAVASCRIPT 的。接下來通過本文給大家介紹BootStrap 附加導航組件的知識,感興趣的朋友一起學習吧
    2016-07-07
  • 微信小程序+ECharts實現(xiàn)動態(tài)刷新的過程記錄

    微信小程序+ECharts實現(xiàn)動態(tài)刷新的過程記錄

    這篇文章主要給大家介紹了關于微信小程序+ECharts實現(xiàn)動態(tài)刷新的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • js+canvas實現(xiàn)轉(zhuǎn)盤效果(兩個版本)

    js+canvas實現(xiàn)轉(zhuǎn)盤效果(兩個版本)

    這篇文章主要為大家詳細介紹了兩個版本的js+canvas實現(xiàn)轉(zhuǎn)盤效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • javascript兼容性(實例講解)

    javascript兼容性(實例講解)

    下面小編就為大家?guī)硪黄猨avascript兼容性(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 對frameset、frame、iframe的js操作示例代碼

    對frameset、frame、iframe的js操作示例代碼

    父框架到子框架的引用、子框架到父框架的引用、兄弟框架間的引用、不同層次框架間的互相引用具體實現(xiàn)如下,有此需求的朋友可以參考下
    2013-08-08
  • 利用a標簽自動解析URL分析網(wǎng)址實例

    利用a標簽自動解析URL分析網(wǎng)址實例

    a標簽也和window.location一樣,也有這樣屬性,因此可以利用它來分析網(wǎng)址,下面的實例代碼,大家可以看看
    2014-10-10
  • js類定義函數(shù)時用prototype與不用的區(qū)別示例介紹

    js類定義函數(shù)時用prototype與不用的區(qū)別示例介紹

    沒有使用prototype的方法相當于類的靜態(tài)方法,相反,使用prototype的方法相當于類的實例方法,不許new后才能使用
    2014-06-06
  • 深入淺析JS中的嚴格模式

    深入淺析JS中的嚴格模式

    嚴格模式就是使JS編碼更加規(guī)范化的模式,消除Javascript語法的一些不合理、不嚴謹之處,減少一些怪異行為。下面通過代碼相結(jié)合的形式給大家介紹js中的嚴格模式,感興趣的朋友一起看看吧
    2018-06-06

最新評論

琼海市| 称多县| 万年县| 出国| 防城港市| 来凤县| 建德市| 武强县| 甘洛县| 广汉市| 克山县| 佛学| 蓬安县| 洪湖市| 禹州市| 河东区| 福贡县| 阳泉市| 武穴市| 遵义县| 吴江市| 新晃| 呼玛县| 马山县| 桃园市| 株洲县| 甘洛县| 巴南区| 巴林右旗| 彭泽县| 芜湖市| 定州市| 富宁县| 日喀则市| 夏河县| 弥渡县| 江陵县| 额尔古纳市| 新邵县| 读书| 白水县|