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

根據一段代碼淺談Javascript閉包

 更新時間:2010年12月14日 21:42:45   作者:  
水平不高,不能也不想從太深的層次去講解這個東西,只是根據一段比較有代表性的代碼,結合執(zhí)行結果,從表象上粗淺地談談。
復制代碼 代碼如下:

function f1(){
var n = 999;
nAdd = function(){ n += 1; }
function f2(){
alert(n);
}
return f2;
}

這里的閉包是f1,封閉了一個變量n和一個函數f2。

我們先無視nAdd,盡量保持原貌重寫一下這個函數。
復制代碼 代碼如下:

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

js中各個變量以function為單元進行封裝,當在function內部找不到某一變量時,function會向其所在的上一單元(上下文)中進行查找,一直查找到頂層的window域。
這時就出現一個疑問:這個查找過程是以函數引用位置為起點還是函數體定義的位置為起點?
在上面這一段代碼中,result所在域是window,但是實際的輸出結果是f1內部的n值,所以可以得出結論:變量查找的起點是函數體定義的位置。

現在再回過頭來看nAdd(第一段代碼)。如我們所知,沒有關鍵字var定義的變量默認進入window域,所以nAdd實際為window.nAdd。這就等同于如下代碼:
復制代碼 代碼如下:

var nAdd;
function f1(){
var n = 999;
nAdd = function(){ n += 1; }
function f2(){
alert(n);
}
return function(){ alert(n); };
}

那么根據我們對result的分析,nAdd的執(zhí)行將影響f1中n的值。
所以有:
復制代碼 代碼如下:

function f1(){
var n = 999;
nAdd = function(){ n += 1; }
function f2(){
alert(n);
}
return function(){ alert(n); };
}
var result = f1();
result();
nAdd();
result();

這段代碼執(zhí)行最終的輸出結果為1000。

再看這種情況:
復制代碼 代碼如下:

function f1(){
var n = 999;
nAdd = function(){ n += 1; }
function f2(){
alert(n);
}
return function(){ alert(n); };
}

f1()(); //<--p1
nAdd();
f1()(); //<--p2

簡述一下執(zhí)行過程:
p1位置,f1封裝了一個匿名的閉包A,在返回A閉包中的函數A:f2后繼而執(zhí)行A:f2,A:f2輸出變量A:n,結果是999。
與此同時,nAdd被賦值為A閉包中的一個函數,下一行執(zhí)行nAdd即讓A:n的值+1。
p2位置,f1封裝匿名的閉包B,所進行的操作都是針對閉包B的,隨后執(zhí)行B:f2輸出的是B:n,所以最后的結果依然是999。
A和B是兩個獨立的“包”,互不影響。

改寫一下函數的調用部分:

復制代碼 代碼如下:

function f1(){
var n = 999;
nAdd = function(){ n += 1; }
function f2(){
alert(n);
}
return function(){ alert(n); };
}

var result = f1();
result();
nAdd();
f1()();
result(); // <--p3

p3位置不意外地輸出了1000。

相關文章

  • 使用HTML5+Boostrap打造簡單的音樂播放器

    使用HTML5+Boostrap打造簡單的音樂播放器

    這篇文章主要介紹了使用HTML5+Boostrap打造簡單的音樂播放器 的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • 高亮顯示web頁表格行的javascript代碼

    高亮顯示web頁表格行的javascript代碼

    本文從簡單的css高亮顯示表格的某一行說開去,探討了在不同瀏覽器下對于高亮功能的兼容性。闡述針對表格本身綁定javascript事件實現這一功能的方法。
    2010-11-11
  • 一次讓你了解全部JavaScript的作用域

    一次讓你了解全部JavaScript的作用域

    這篇文章主要介紹了一次讓你了解全部JavaScript的作用域,作用域決定了變量的生命周期和可見性,變量在作用域范圍之外是不可見的。,需要的朋友可以參考下
    2019-06-06
  • JS模擬面向對象全解(一、類型及傳遞)

    JS模擬面向對象全解(一、類型及傳遞)

    首先說明JS的特點。JS是弱類型的語言,像什么模板多態(tài)、又是類又是結構的說法,就完全不存在。
    2011-07-07
  • JavaScript高級教程5.6之基本包裝類型(詳細)

    JavaScript高級教程5.6之基本包裝類型(詳細)

    在基本類型當中,有三種類型是我們經常使用的:boolean,number,string,通過本篇文章給大家介紹javascript高級教程5.6之基本包裝類型,感興趣的朋友一起學習吧
    2015-11-11
  • js如何根據id刪除數組中對象

    js如何根據id刪除數組中對象

    這篇文章主要介紹了js如何根據id刪除數組中對象的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 微信小程序的mpvue框架快速上手指南

    微信小程序的mpvue框架快速上手指南

    mpvue 是一個使用 Vue.js 開發(fā)小程序的前端框架。這篇文章主要介紹了小程序的mpvue框架 ,需要的朋友可以參考下
    2019-05-05
  • JS 實現點擊a標簽的時候讓其背景更換

    JS 實現點擊a標簽的時候讓其背景更換

    點擊a標簽的時候給其換背景的方法有很多,在本文將為大家介紹下js是如何實現的,感興趣的朋友不要錯過
    2013-10-10
  • BootStrap的Datepicker控件使用心得分享

    BootStrap的Datepicker控件使用心得分享

    bootstrap就非常好用,而且框架布局很漂亮,用起來也很簡單。今天小編給大家分享BootStrap的Datepicker控件使用心得,一起看看吧
    2016-05-05
  • JS函數的定義與調用方法推薦

    JS函數的定義與調用方法推薦

    下面小編就為大家?guī)硪黄狫S函數的定義與調用方法推薦。小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05

最新評論

富源县| 中卫市| 岗巴县| 赣榆县| 博湖县| 巴中市| 东丰县| 句容市| 镇坪县| 霍城县| 余姚市| 灵武市| 奇台县| 峡江县| 项城市| 临邑县| 剑阁县| 马鞍山市| 得荣县| 武功县| 柞水县| 丹东市| 柞水县| 永顺县| 东丽区| 德令哈市| 清苑县| 阳山县| 新民市| 当雄县| 宜黄县| 崇信县| 革吉县| 松江区| 页游| 南木林县| 巢湖市| 苗栗县| 达日县| 扶风县| 象山县|