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

首頁 > 語言 > JavaScript > 正文

JavaScript變量的作用域全解析

2024-05-06 16:24:29
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了JavaScript變量的作用域的基本知識,是JavaScript入門學習中的基礎知識,需要的朋友可以參考下

變量作用域是程序中定義這個變量的區域。

先來看一段示例:

/* 代碼1 */

  1. var scope = "global "
  2. function checkScope() { 
  3. var scope = "local "
  4. function childCheck() { 
  5. var scope = "childLocal "
  6. document.write(scope); 
  7. function childUndefined() { 
  8. document.write(scope); 
  9. var scope; 
  10. function childOverride() { 
  11. scope = "childOverride "
  12. document.write(scope); 
  13. document.write(scope); //輸出"local" 
  14. childCheck(); //輸出"childLocal" 
  15. childUndefined(); //輸出"undefined" 
  16. childOverride(); //輸出"childOverride" 
  17. document.write(scope); //輸出"childOverride" 
  18. checkScope(); //輸出"local childLocal undefinedchildOverride childOverride" 
  19. document.write(scope); //輸出"global " 


全局作用域與局部作用域

全局(global)變量的作用域是全局的,在Javascript中處處有定義;而函數內部聲明的變量是局部(local)變量,其作用域是局部性的,只在函數體內部有定義。對于下面的輸出讀者應不會感到意外。

/* 代碼2 */

 

 
  1. var scope = "global"
  2. function checkScope() { 
  3. var scope = "local"
  4. document.write(scope); 
  5. checkScope(); //輸出"local" 
  6. document.write(scope); //輸出"global" 

全局變量作用域中使用變量可以不用var語句,但在聲明局部變量是一定要使用var語句,否則會視為對全局變量的引用??聪旅娲a:

/* 代碼3 */

 

 
  1. var scope = "global"
  2. function checkScope() { 
  3. scope = "local"
  4. document.write(scope); 
  5. checkScope(); //輸出"local" 
  6. document.write(scope); //輸出"local" 

沒有塊作用域

Javascript沒有塊級作用域,函數中聲明的變量在整個函數中都是有定義的。對于下面的代碼對于生疏的讀者可能頗感意外:

/* 代碼4 */

 

  1. var scope = "global"
  2. function checkScope() { 
  3. document.write(scope); //語句4.1 
  4. var scope = "local"//語句4.2 
  5. document.write(scope); 
  6. checkScope(); //輸出"undefinedlocal" 

由于語句4.1(var scope = "local";)聲明的變量在整個checkScope函數作用域內都有效,因此在語句4.2(document.write(scope); )執行的時scope引用的是局部變量,而此時局部變量scope尚未定義,所以輸出”undefined”。因此一個好的編程習慣是將所有的變量聲明集中起來放在函數的開頭。

在了解了上述內容之后,讀者再看看代碼1應該不會感到困惑了。

對象的屬性變量

對象的屬性變量比較容易理解,看一下下面的代碼讀者應該不會感到疑惑。

/* 代碼5 */

 

 
  1. var scope = "global "
  2. var obj = new Object(); 
  3. obj.scope = "object "
  4. obj.checkScope = function () { 
  5. var scope = "loacl "
  6. document.write(scope); //輸出"loacl" 
  7. document.write(this.scope); //輸出"object" 
  8. document.write(window.scope); //輸出"global" 
  9. obj.checkScope(); //輸出"loacl object global" 

所謂作用域,就是說這個變量在代碼塊中的有效范圍。如果不理解 JavaScript 作用域,調試代碼的時候可能會比較困難。

在函數中,如果用var來聲明一個變量,那么該變量的作用域就只限于該函數內部,函數外的代碼無法訪問該變量。如果在該函數中再聲明一個函數,那么這個內部的函數也可以訪問這個變量。

反過來,如果聲明變量的時候沒有用var,那么此變量的作用域就不局限于這個函數了。JavaScript 引擎會再全局范圍中檢查該變量是否被定義過。如果該變量沒有被定義過,那么它就會被定義為一個全局變量。

函數可以訪問相同作用域中的變量:

 

 
  1. var foo = 'hello'
  2.  
  3. var sayHello = function() { 
  4. console.log(foo); 
  5. }; 
  6.  
  7. sayHello(); // logs 'hello' 
  8. console.log(foo); // also logs 'hello' 

變量作用域之外的代碼不能訪問該變量:

 

 
  1. var sayHello = function() { 
  2. var foo = 'hello'
  3. console.log(foo); 
  4. }; 
  5.  
  6. sayHello(); // logs 'hello' 
  7. console.log(foo); // doesn't log anything 

不用作用域中名稱相同的變量,有不同的值:

 

 
  1. var foo = 'world'
  2.  
  3. var sayHello = function() { 
  4. var foo = 'hello'
  5. console.log(foo); 
  6. }; 
  7.  
  8. sayHello(); // logs 'hello' 
  9. console.log(foo); // logs 'world' 

函數定以后可以看到函數內變量值的改變:

 

 
  1. var myFunction = function() { 
  2. var foo = 'hello'
  3.  
  4. var myFn = function() { 
  5. console.log(foo); 
  6. }; 
  7.  
  8. foo = 'world'
  9.  
  10. return myFn; 
  11. }; 
  12.  
  13. var f = myFunction(); 
  14. f(); // logs 'world' -- haha 

作用域也會穿越 — 閉包

 

 
  1. // 一個自執行的匿名函數 
  2. (function() { 
  3. var baz = 1; 
  4. var bim = function() { alert(baz); }; 
  5. bar = function() { alert(baz); }; 
  6. })(); 
  7.  
  8. console.log(baz); // 在函數外面不能訪問 baz 
  9.  
  10. bar(); // 聲明 bar 的時候并沒有用 var 
  11. // 所以 bar 是一個全局變量; 但是, 
  12. // bar 和 baz 在相同的作用域內被定義, 
  13. // 所以 bar 可以訪問 baz 
  14. // 其實 bar 是個閉包函數 
  15.  
  16. bim(); // bim 的作用域只限于匿名函數內部, 
  17. // 所以這里不能調用 

綜合

所謂作用域,就是說這個變量在代碼塊中的有效范圍。如果不理解 JavaScript 作用域,調試代碼的時候可能會比較困難。

在函數中,如果用var來聲明一個變量,那么該變量的作用域就只限于該函數內部,函數外的代碼無法訪問該變量。如果在該函數中再聲明一個函數,那么這個內部的函數也可以訪問這個變量。

反過來,如果聲明變量的時候沒有用var,那么此變量的作用域就不局限于這個函數了。JavaScript 引擎會再全局范圍中檢查該變量是否被定義過。如果該變量沒有被定義過,那么它就會被定義為一個全局變量。

函數可以訪問相同作用域中的變量:

 

  1. var foo = 'hello'
  2.  
  3. var sayHello = function() { 
  4. console.log(foo); 
  5. }; 
  6.  
  7. sayHello(); // logs 'hello' 
  8. console.log(foo); // also logs 'hello' 

變量作用域之外的代碼不能訪問該變量:

 

 
  1. var sayHello = function() { 
  2. var foo = 'hello'
  3. console.log(foo); 
  4. }; 
  5.  
  6. sayHello(); // logs 'hello' 
  7. console.log(foo); // doesn't log anything 

不用作用域中名稱相同的變量,有不同的值:

 

 
  1. var foo = 'world'
  2.  
  3. var sayHello = function() { 
  4. var foo = 'hello'
  5. console.log(foo); 
  6. }; 
  7.  
  8. sayHello(); // logs 'hello' 
  9. console.log(foo); // logs 'world' 

函數定以后可以看到函數內變量值的改變:

 

 
  1. var myFunction = function() { 
  2. var foo = 'hello'
  3.  
  4. var myFn = function() { 
  5. console.log(foo); 
  6. }; 
  7.  
  8. foo = 'world'
  9.  
  10. return myFn; 
  11. }; 
  12.  
  13. var f = myFunction(); 
  14. f(); // logs 'world' -- haha 

作用域也會穿越 — 閉包

 

 
  1. // 一個自執行的匿名函數 
  2. (function() { 
  3. var baz = 1; 
  4. var bim = function() { alert(baz); }; 
  5. bar = function() { alert(baz); }; 
  6. })(); 
  7.  
  8. console.log(baz); // 在函數外面不能訪問 baz 
  9.  
  10. bar(); // 聲明 bar 的時候并沒有用 var 
  11. // 所以 bar 是一個全局變量; 但是, 
  12. // bar 和 baz 在相同的作用域內被定義, 
  13. // 所以 bar 可以訪問 baz 
  14. // 其實 bar 是個閉包函數 
  15.  
  16. bim(); // bim 的作用域只限于匿名函數內部, 
  17. // 所以這里不能調用 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av三级在线观看| 国产精品久久婷婷六月丁香| 亚洲女人天堂色在线7777| 亚洲精品www久久久久久广东| 国产在线观看一区二区三区| 国产男女猛烈无遮挡91| 久久久久这里只有精品| 久久久久久久爱| 亚洲免费伊人电影在线观看av| 欧美日韩一区二区三区| 国产亚洲精品久久| 国模私拍一区二区三区| 久久免费观看视频| 日韩电影免费观看在线观看| 91亚洲国产成人精品性色| 国产精品电影在线观看| 欧美综合国产精品久久丁香| 97av在线视频| 福利视频一区二区| 91av在线影院| 狠狠躁夜夜躁人人躁婷婷91| 欧美日韩国产综合新一区| 欧美色欧美亚洲高清在线视频| 国内外成人免费激情在线视频| 国产精品盗摄久久久| 成年人精品视频| 国产精品久久99久久| 中文字幕免费精品一区| 亚洲日本aⅴ片在线观看香蕉| 亚洲第一视频在线观看| 免费av一区二区| 日韩性生活视频| 国产精品一区久久久| 宅男66日本亚洲欧美视频| 亚洲精品98久久久久久中文字幕| 日韩欧美在线字幕| 奇米4444一区二区三区| 国产色综合天天综合网| 欧美—级高清免费播放| 在线电影av不卡网址| 日韩在线观看你懂的| 精品国产依人香蕉在线精品| 日韩中文视频免费在线观看| 中文字幕亚洲综合久久| 日韩av在线免费观看一区| 一区二区三区四区在线观看视频| 在线观看精品自拍私拍| 久久99视频免费| 久久视频在线观看免费| 精品自拍视频在线观看| 国产精品久久激情| 久国内精品在线| 欧美日韩午夜剧场| 国产日韩精品在线播放| 国产成人精品久久亚洲高清不卡| 亚洲午夜色婷婷在线| 国内精品400部情侣激情| 精品久久久久久久久久久| 欧美成人精品在线视频| 日韩美女av在线免费观看| 久久久免费在线观看| 日韩精品视频在线| 亚洲图片在区色| 日韩美女在线观看| 91在线网站视频| 久久在线精品视频| 美女黄色丝袜一区| 亚洲人成77777在线观看网| 亚洲网站视频福利| 欧美日韩xxxxx| 成人免费网站在线看| 国产精品久久久久久久久久尿| 宅男66日本亚洲欧美视频| 亲爱的老师9免费观看全集电视剧| 欧美极品美女视频网站在线观看免费| 欧美激情xxxx| 国产精品入口日韩视频大尺度| 亚洲第一免费播放区| 日韩视频在线观看免费| 亚洲人成网站999久久久综合| 成人h视频在线| 永久免费毛片在线播放不卡| 国产精品视频地址| 国产精品中文字幕在线| 欧美精品videosex牲欧美| 欧美理论片在线观看| 亚洲男人的天堂在线播放| 精品国产乱码久久久久久天美| 操日韩av在线电影| 国产精品一区二区三区成人| 日韩电影中文字幕在线观看| 国产精品麻豆va在线播放| 国产欧美精品日韩| 中文字幕最新精品| 亚洲一区二区免费| 亚洲国产天堂网精品网站| 久久综合免费视频| 国产成人精品视频在线| 亚洲国产欧美一区二区三区同亚洲| 国产精品久久中文| 久久久视频在线| 色小说视频一区| 日韩中文字幕在线播放| 亚洲日本欧美日韩高观看| 欧美天堂在线观看| 91精品久久久久久久久久入口| 精品一区二区三区电影| zzijzzij亚洲日本成熟少妇| 亚洲激情在线视频| 91美女福利视频高清| 国产一区二区色| 国产精彩精品视频| 国产成人一区二区三区小说| 国产成人亚洲综合青青| 国产精品99久久久久久白浆小说| 国产欧美日韩视频| 91九色精品视频| 欧美成aaa人片免费看| 亚洲丝袜av一区| 精品亚洲夜色av98在线观看| 97av视频在线| 色婷婷亚洲mv天堂mv在影片| 亚洲第一免费网站| 国产91久久婷婷一区二区| 亚洲国产高清自拍| 欧美资源在线观看| 国产精品无av码在线观看| 成人97在线观看视频| 日韩中文字幕在线免费观看| 久久夜色精品国产亚洲aⅴ| 国产精品一区二区久久国产| 亚洲国产精品久久久久| 久操成人在线视频| 久久亚洲一区二区三区四区五区高| 欧美国产中文字幕| 国产精品白嫩初高中害羞小美女| 亚洲国内精品视频| 欧美日韩国产丝袜美女| 亚洲第一精品福利| 91在线观看免费高清| 欧美日韩免费看| 日本19禁啪啪免费观看www| 久久亚洲一区二区三区四区五区高| 欧美性videos高清精品| 精品国产一区久久久| 欧美激情综合亚洲一二区| 欧美一区二区三区四区在线| 日韩经典中文字幕在线观看| 色先锋久久影院av| 不卡av电影在线观看| 亚洲jizzjizz日本少妇| 丝袜情趣国产精品| 国产精品久久中文| 国产美女精品视频免费观看| 国产成人在线视频| 欧美性生活大片免费观看网址| 成人精品视频在线| 北条麻妃99精品青青久久| 日韩成人在线播放| 欧美午夜电影在线| 亚洲精品国产精品国产自| 日韩精品中文字幕有码专区| 九九精品视频在线| 欧美在线免费看|