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

首頁 > 語言 > 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語句,否則會視為對全局變量的引用。看下面代碼:

/* 代碼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. // 所以這里不能調用 

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

圖片精選

主站蜘蛛池模板: 闽侯县| 叶城县| 揭西县| 固始县| 团风县| 越西县| 金寨县| 巴南区| 逊克县| 康平县| 新巴尔虎右旗| 长兴县| 普格县| 自贡市| 西和县| 黔江区| 鲁山县| 栖霞市| 米易县| 泾源县| 福海县| 柞水县| 颍上县| 中西区| 巫溪县| 潮州市| 郎溪县| 津市市| 湟源县| 扎兰屯市| 香格里拉县| 东乡族自治县| 响水县| 信宜市| 来宾市| 阜南县| 阿鲁科尔沁旗| 周至县| 西平县| 甘南县| 黔西县|