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

首頁 > 編程 > JavaScript > 正文

深入淺析javascript中的作用域(推薦)

2019-11-20 09:27:17
字體:
來源:轉載
供稿:網友

所謂的作用域,可以簡單理解為一個可以讀、寫的范圍(區域),有些js經驗的同學可能會說:"js沒有塊級作用域",js除了全局作用域外,只有函數可以創建作用域。作用域的一個好處就是可以隔離變量。

我們通過一些例子來幫助我們理解js中的作用域。

 alert(a); var a = 1; 

如果對作用域一點不了解的同學可能會說 alert的是1或者報錯;但實際上是undefined;

說到這里,我們首先說一下js逐行解析代碼之前做的一些準備工作,

js在逐行讀代碼之前,會做一些“預解析”工作,會先提前找到一些”小東西”,當然”js解析器“不會隨便找一些數據的,它會根據var,function,參數來找。

”js解析器“它比較”懶“,在正式運行代碼之前都會給var聲明的變量賦值為undefined,也就是var a = undefined;會把整個函數看作一個代碼塊,不去管里邊有多少代碼。參數等到后邊例子中會說。

當所有準備工作都做好后,“JS解析器”就開始逐行執行代碼了,現在我們來分析開始的這個例子就很容易明白為什么是undefined了。

再來看下邊這個例子

 alert(a); var a = 1; alert(a); var a = 2; alert(a); 

我們來一點點分析這個

首先 ”預解析“: 解析器會找var

讀到第二行時 a = undefined;

讀到第四行時 依然 a = undefined;

正式逐行執行代碼:

第一行 alert:undefined 

第二行 a = 1;

第三行 alert:1;

第五行 alert:2

接著看下邊這個例子

 alert(a);  var a = 1; alert(a);  function a (){ alert(2); } alert(a);  var a = 3;  alert(a);  function a (){ alert(4); } alert(a);

我們依然來一點點分析這個

首先 ”預解析“: 解析器會找var function;

讀到第二行時 a = undefined;

讀到第四行時 a = function a (){ alert(2);} //所有的函數,在正式運行代碼之前,都是整個函數塊;變量遇到重名的,只留一個變量,如果變量和函數重名,就只留下函數。

讀到第六行時,a = function a (){ alert(2);}

讀到第八行時,a = function a (){ alert(4);}

正式逐行執行代碼:

第一行 alert: function a (){ alert(4);} 

第二行 a = 1; //表達式可以修改預解析的值!

第三行 alert:1;

第四行 函數沒有調用,略過;

第五行 alert:1;

第六行 a = 3;

第七行 alert:3

第八行 函數沒有調用,略過;

第九行 alert:3

如圖所示:

繼續看例子:

var a = 1;function fn1(){ alert(a); //undefined    var a = 2;}fn1();alert(a); //1

首先 ”預解析“: 解析器會找var function

讀到第一行時 a = undefined;

讀到第二行時 fn1 = function fn1 (){alert(2);var a = 2;}

正式逐行執行代碼: 第一行 a = 1;

第六行 函數調用,進入函數作用域 在函數作用域內依舊是先預解析,再逐行執行

  函數內預解析:a = undefined;

  執行:alert:undefined;

  a = 2; //此時的a僅為函數作用域中的a,不會影響全局中的a

函數執行完畢,回到全局作用域;

第七行 alert:1;

繼續:

var a = 1;function fn1(){ alert(a); //1   a = 2;}fn1();alert(a); //2

這個例子上邊那個例子唯一的區別就是函數中的a沒有var,只分析其中關鍵的地方

在函數作用域中 第三行alert(a),由于函數中沒有var a,所以"解析器"會到函數的作用域的上一級作用域去尋找a(作用域上下級關系的確定就看函數是在哪個作用域下創建的,在哪個作用域下創建,就是哪個作用域的下級),此時函數的上一級是全局作用域,在全局作用域中,a = 1,所以此時第三行 alert:1,接著第四行,a = 2賦值,依然是函數作用域中沒有a, 所以在上一級作用域,也就是全局作用域中找到a,修改全局作用域中的a, 所以會使全局作用域中的a = 2, 因此第七行 alert:2;

這點要理解清楚,注意有無var的區別。

接著來:

 var a = 1; function fn1(a){ alert(a); //undefined  a = 2; } fn1(); alert(a); // 1

這個例子和上一個的區別就是多了個參數,參數的作用相當于局部變量,也就是在函數中預解析會有var a = undefined,所以第三行 alert:undefined,第四行 a = 2 改的是函數作用域中的a,不影響全局中的a,第七行alert:1;

接著:

var a = 1;function fn1(a){alert(a); // 1a = 2;}fn1(a);alert(a); // 1

這個例子又與上一個有些區別,在第六行函數調用時傳了個實參進去,第六行函數實參的a是全局變量a = 1的1,函數執行時,第二行 a = 1,所以第三行alert:1,第七行alert:1。

注意這幾個例子之間的區別,別混淆了。

再來一個:

var a = 1;function en(){var a = 2;fn();}function fn(){alert(a); //1}en();

fn中的a未聲明,要到創建這個函數的那個作用域中取值――是“創建”,而不是“調用”這個函數的作用域中。

PS:JavaScript中的作用域和上下文概念

javascript中的作用域(scope)和上下文(context)是這門語言的獨到之處,這部分歸功于他們帶來的靈活性。每個函數有不同的變量上下文和作用域。這些概念是javascript中一些強大的設計模式的后盾。然而這也給開發人員帶來很大困惑。下面全面揭示了javascript中的上下文和作用域的不同,以及各種設計模式如何使用他們。

上下文 vs 作用域

首先需要澄清的問題是上下文和作用域是不同的概念。多年來我注意到許多開發者經常將這兩個術語混淆,錯誤的將一個描述為另一個。平心而論,這些術語變得非常混亂不堪。

每個函數調用都有與之相關的作用域和上下文。從根本上說,范圍是基于函數(function-based)而上下文是基于對象(object-based)。換句話說,作用域是和每次函數調用時變量的訪問有關,并且每次調用都是獨立的。上下文總是關鍵字 this 的值,是調用當前可執行代碼的對象的引用。

以上所述是小編給大家介紹的javascript中的作用域(推薦),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久亚洲调教| 久久av红桃一区二区小说| 欧美富婆性猛交| 中文.日本.精品| 国产69久久精品成人看| 成人h猎奇视频网站| 欧美巨乳美女视频| 国产一区二区久久精品| 国产精品91在线观看| 久久久之久亚州精品露出| 在线播放精品一区二区三区| 中文在线资源观看视频网站免费不卡| 在线观看欧美日韩国产| 成人黄色午夜影院| 国产亚洲福利一区| 国产日韩欧美在线观看| 欧美电影电视剧在线观看| 久久久久国色av免费观看性色| 日韩精品中文字幕在线| 亚洲国模精品私拍| 人体精品一二三区| 美女久久久久久久| 精品日韩中文字幕| 国产精品美女www爽爽爽视频| 国产精品福利在线观看网址| 久久亚洲综合国产精品99麻豆精品福利| 在线不卡国产精品| 国产精品视频免费在线观看| 97超级碰碰人国产在线观看| 亚洲自拍欧美另类| 97超碰国产精品女人人人爽| 国产精品亚发布| 欧美国产精品va在线观看| 欧美在线视频在线播放完整版免费观看| 97在线精品国自产拍中文| 久久精品国产视频| 成人免费视频网| 91综合免费在线| 国产91av在线| 中文字幕亚洲欧美| 国产在线精品一区免费香蕉| 国产一区玩具在线观看| 91精品国产91久久久久久最新| 一区二区三区四区在线观看视频| 亚洲无限乱码一二三四麻| 成人黄色中文字幕| 国产成人中文字幕| 亚洲国产毛片完整版| 欧美性在线观看| 在线观看久久久久久| 免费97视频在线精品国自产拍| 成人精品福利视频| 国产人妖伪娘一区91| 国产一区二区三区在线视频| 成人激情视频在线播放| 亚洲精品国产综合久久| 日韩亚洲欧美中文在线| 成人久久一区二区| 亚洲激情视频在线观看| 青草成人免费视频| 久久精品电影网| 日韩av在线电影网| 久久这里只有精品99| 国产成人精品久久| zzijzzij亚洲日本成熟少妇| 国产丝袜一区二区三区免费视频| 91精品久久久久久久久青青| 精品高清美女精品国产区| 亚洲精品国产美女| 国产精品一区二区久久国产| 日韩免费观看网站| 欧美激情欧美激情| 欧美日韩美女在线观看| 日韩av电影国产| 日韩精品极品在线观看播放免费视频| 久久亚洲国产精品成人av秋霞| 欧美日韩免费在线| 国内自拍欧美激情| 欧美疯狂性受xxxxx另类| 日韩精品免费一线在线观看| 欧美三级免费观看| 北条麻妃在线一区二区| 2020久久国产精品| 欧美日韩高清在线观看| 九九热99久久久国产盗摄| 欧美激情视频免费观看| 欧美一二三视频| 欧美黑人极品猛少妇色xxxxx| 国产亚洲成av人片在线观看桃| 成人疯狂猛交xxx| 日韩精品极品在线观看| 色哟哟入口国产精品| 国产日韩av高清| 96pao国产成视频永久免费| 亚洲欧美日韩久久久久久| 亚洲国产高清高潮精品美女| 久久国产精品久久国产精品| 欧洲成人午夜免费大片| 91久久国产精品| 欧美疯狂性受xxxxx另类| 亚洲国产一区自拍| 欧美激情亚洲精品| 91免费福利视频| 粗暴蹂躏中文一区二区三区| 亚洲成色777777女色窝| 亚洲系列中文字幕| 亚洲国产97在线精品一区| 懂色aⅴ精品一区二区三区蜜月| 91高清视频免费| 精品国产乱码久久久久久天美| 青青在线视频一区二区三区| 日韩欧美在线免费观看| 日韩中文在线中文网在线观看| 国产精品美女午夜av| 亚洲国产精彩中文乱码av在线播放| 国产欧美日韩高清| 日韩视频在线观看免费| 中文国产亚洲喷潮| 久久久国产视频91| 中文字幕日韩av电影| 青青在线视频一区二区三区| 欧美日韩999| 久久久黄色av| 国产精品久久久| 亚洲第一免费网站| 精品一区二区三区电影| 亚洲最大的免费| 国产在线精品一区免费香蕉| 国产不卡在线观看| 精品人伦一区二区三区蜜桃免费| 国产69精品久久久久久| 欧美性理论片在线观看片免费| 国产日本欧美在线观看| 国产精品美女网站| 国产午夜精品全部视频播放| 欧美激情乱人伦| 国内外成人免费激情在线视频| 91精品视频专区| 亚洲春色另类小说| 精品国产成人av| 久久伊人精品一区二区三区| 久久亚洲精品中文字幕冲田杏梨| 日韩欧美在线观看视频| 亚洲精品国精品久久99热| 国产亚洲福利一区| 欧美福利视频网站| 国产精品久久久久久五月尺| 欧美性极品xxxx做受| 日韩69视频在线观看| 欧美黄色片视频| 国产日韩欧美综合| 国产91在线播放九色快色| 欧美xxxx做受欧美| 日韩在线观看电影| 日韩av在线看| 日韩亚洲综合在线| 国产成人avxxxxx在线看| 欧美在线视频免费| 成人免费福利在线| 一区二区三区国产在线观看| 亚洲欧美一区二区三区四区| 国产欧美最新羞羞视频在线观看| 91精品久久久久久久久久久久久| 亚洲免费伊人电影在线观看av|