欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

根據(jù)一段代碼淺談Javascript閉包

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

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

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

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

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

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

現(xià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); };
}

那么根據(jù)我們對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閉包中的函數(shù)A:f2后繼而執(zhí)行A:f2,A:f2輸出變量A:n,結果是999。
與此同時,nAdd被賦值為A閉包中的一個函數(shù),下一行執(zhí)行nAdd即讓A:n的值+1。
p2位置,f1封裝匿名的閉包B,所進行的操作都是針對閉包B的,隨后執(zhí)行B:f2輸出的是B:n,所以最后的結果依然是999。
A和B是兩個獨立的“包”,互不影響。

改寫一下函數(shù)的調用部分:

復制代碼 代碼如下:

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。

相關文章

  • javascript中attachEvent用法實例分析

    javascript中attachEvent用法實例分析

    這篇文章主要介紹了javascript中attachEvent用法,實例分析了javascript中事件綁定的相關技巧,需要的朋友可以參考下
    2015-05-05
  • 原生js實現(xiàn)tab選項卡切換

    原生js實現(xiàn)tab選項卡切換

    這篇文章主要為大家詳細介紹了原生js實現(xiàn)tab選項卡,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 再談JavaScript線程

    再談JavaScript線程

    繼上篇討論了一些關于JavaScript線程的知識,我們不妨回過頭再看看,是不是JavaScript就不能多線程呢?看下面一段很簡單的代碼(演示用,沒考慮兼容問題):
    2015-07-07
  • ES6 class的應用實例分析

    ES6 class的應用實例分析

    這篇文章主要介紹了ES6 class的應用,結合實例形式分析了class在ES6面向對象程序設計中定義類的相關操作技巧,需要的朋友可以參考下
    2019-06-06
  • JS 實現(xiàn)導航欄懸停效果

    JS 實現(xiàn)導航欄懸停效果

    使用js實現(xiàn)的導航欄懸停效果在IE上,滾動滾動條或者鼠標滾輪的時候,導航欄會抖動;而在Chrome和FF上有沒有任何問題
    2013-09-09
  • 教你javascript如何獲取對象的key和value

    教你javascript如何獲取對象的key和value

    獲取對象所有key的方法,需要使用?Object.keys(obj)?方法,Object.keys(obj)方返回一個數(shù)組,這個數(shù)組包含obj對象中的所有key,這篇文章主要介紹了javascript如何獲取對象的key和value,需要的朋友可以參考下
    2022-12-12
  • 微信小程序將頁面按鈕懸浮固定在底部的實現(xiàn)代碼

    微信小程序將頁面按鈕懸浮固定在底部的實現(xiàn)代碼

    這篇文章主要介紹了微信小程序將頁面按鈕懸浮固定在底部的實現(xiàn)代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • JS實現(xiàn)HTML表格排序功能

    JS實現(xiàn)HTML表格排序功能

    這篇文章主要為大家詳細介紹了JS實現(xiàn)HTML表格排序功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • JavaScript canvas繪制折線圖

    JavaScript canvas繪制折線圖

    這篇文章主要為大家詳細介紹了JavaScript canvas繪制折線圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • JS實現(xiàn)仿FLASH效果的豎排導航代碼

    JS實現(xiàn)仿FLASH效果的豎排導航代碼

    這篇文章主要介紹了JS實現(xiàn)仿FLASH效果的豎排導航代碼,涉及JavaScript基于定時函數(shù)動態(tài)設置頁面元素樣式的技巧,具有FLASH變換效果,需要的朋友可以參考下
    2015-09-09

最新評論