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

首頁(yè) > 編程 > JavaScript > 正文

js閉包用法實(shí)例詳解

2019-11-19 18:31:46
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例講述了js閉包用法。分享給大家供大家參考,具體如下:

引言

在公司中需要寫(xiě)一個(gè)js腳本來(lái)進(jìn)行網(wǎng)站的統(tǒng)計(jì),實(shí)現(xiàn)類似百度統(tǒng)計(jì)或者站長(zhǎng)統(tǒng)計(jì)的功能,在實(shí)現(xiàn)的過(guò)程中自己感覺(jué)寫(xiě)的代碼還是可以的,因?yàn)橹暗膉s代碼都是這些寫(xiě),但是在組長(zhǎng)代碼走查的時(shí)候卻非常的不滿意,因?yàn)槲覀冊(cè)趈s中寫(xiě)的方法都是全局的方法,因?yàn)槲覀儗?xiě)的東西需要嵌入到別人的界面中,所以這些全局的東西很可能會(huì)和別人的東西重名從而引發(fā)錯(cuò)誤,所以說(shuō)組長(zhǎng)就給我留下一句話:用js閉包包起來(lái)。

變量作用域

我們都非常的熟悉變量的作用域就分為:全局變量和局部變量。js中在函數(shù)的內(nèi)部可以直接讀取全局變量。

Js代碼

var n=999;function f1(){  alert(n);}f1(); // 999

另一方面,在函數(shù)外部自然無(wú)法讀取函數(shù)內(nèi)的局部變量。

Js代碼

function f1(){  var n=999;}alert(n); // error

我們還需要注意,在js中如果聲明變量的時(shí)候一定要用var命令,否則實(shí)際上聲明了一個(gè)全局的變量!

function f1(){  n=999;}f1();alert(n); // 999

如何從外部讀取全局變量?

我們需要得到函數(shù)內(nèi)部的全局變量該怎么辦呢?。在正常情況下我們是做不到的,要想這么實(shí)現(xiàn)我們必須想一些辦法――在函數(shù)的內(nèi)部在定義一個(gè)函數(shù):

function f1(){  n=999;  function f2(){    alert(n); // 999  }}

在上面的代碼中,函數(shù)f2就被包括在函數(shù)f1內(nèi)部,這時(shí)f1內(nèi)部的所有局部變量,對(duì)f2都是可見(jiàn)的。但是反過(guò)來(lái)就不行,f2內(nèi)部的局部變量,對(duì)f1 就是不可見(jiàn)的。這就是JavaScript語(yǔ)言特有的“鏈?zhǔn)阶饔糜颉苯Y(jié)構(gòu)(chain scope),子對(duì)象會(huì)一級(jí)一級(jí)地向上尋找所有父對(duì)象的變量。所以,父對(duì)象的所有變量,對(duì)子對(duì)象都是可見(jiàn)的,反之則不成立。

既然f2可以讀取f1中的局部變量,那么只要把f2作為返回值,我們不就可以在f1外部讀取它的內(nèi)部變量了嗎!

function f1(){  n=999;  function f2(){    alert(n);  }  return f2;}var result=f1();result(); // 999

閉包的概念

在上面的代碼中f2函數(shù),就是閉包。各種專業(yè)文獻(xiàn)上的“閉包”(closure)定義非常抽象,很難看懂。我的理解是,閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。由于在Javascript語(yǔ)言中,只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量,因此可以把閉包簡(jiǎn)單理解成“定義在一個(gè)函數(shù)內(nèi)部的函數(shù)”。所以,在本質(zhì)上,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的一座橋梁。

下面來(lái)分享一下我們?cè)陧?xiàng)目中用到的js閉包的寫(xiě)法:

(function () {  function getPageTitle() {    return document.title;  }  function getBrowerLanguage() {    var browerLanguage = !navigator.browserLanguage ? navigator.language : navigator.browserLanguage;    return browerLanguage;  }  /**   * 當(dāng)前頁(yè)面地址#后的部分   */  function getLastUrl() {    var url = window.location.hash;    if (!url) {      return null;    }    else {      return url.toString().split("#")[1];    }  }  function GetRandomNum() {    var arr = document.cookie.match(new RegExp("(^| )" + "statisticssCookie=([^;]*)(;|$)"));    if (arr != null) {      return arr[2];    } else {      var tempRandomNum = guid();      document.cookie = "statisticssCookie = " + tempRandomNum;      return tempRandomNum;    }  }  function guid() {    function S4() {      return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);    }    return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());  }  function addJs() {    var url = "http://localhost:10086/tongji/tongji/do?title=" + getPageTitle() + "&browerLanguage=" + getBrowerLanguage() + "&lastUrl=" + getLastUrl() + "&upFlag=" + GetRandomNum();    var head = document.getElementsByTagName('head')[0];    var js = document.createElement('script');    js.type = 'text/javascript';    js.src = url;    head.appendChild(js);  }  window.statistics = addJs;//將addJs這個(gè)方法掛在window下面,這樣在外界是可以訪問(wèn)的,否則外界永不能訪問(wèn)到我寫(xiě)的方法  document.ready = addJs();//DOM樹(shù)加載完成后執(zhí)行})(window)

小結(jié)

在開(kāi)始的時(shí)候組長(zhǎng)就問(wèn)我會(huì)不會(huì)js閉包函數(shù),因?yàn)槿绻粫?huì)閉包寫(xiě)不出很好的代碼。寫(xiě)的代碼都非常的粗糙,所以說(shuō)我們?cè)趯?xiě)代碼的時(shí)候,不能僅僅滿足功能實(shí)現(xiàn),而且需要考慮一些其他方面的東西。當(dāng)然js閉包在使用的時(shí)候也有一些弊端,所以我們?cè)谑褂玫臅r(shí)候也需要綜合全面的信息考慮。

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》、《JavaScript切換特效與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》及《JavaScript遍歷算法與技巧總結(jié)

希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 得荣县| 怀仁县| 蒙山县| 环江| 汽车| 仁寿县| 鄂尔多斯市| 宝鸡市| 九寨沟县| 临西县| 将乐县| 屯门区| 光泽县| 建宁县| 泾川县| 肇庆市| 桓台县| 鱼台县| 龙门县| 安丘市| 淮安市| 苏尼特右旗| 阜阳市| 镶黄旗| 鹿泉市| 潼南县| 吐鲁番市| 福海县| 琼海市| 平山县| 宜都市| 腾冲县| 双流县| 盐边县| 磐石市| 广南县| 诸暨市| 沭阳县| 潢川县| 咸丰县| 宁津县|