JavaScript 作用域

JavaScript 作用域

在 JavaScript 中, 物件和函數同樣也是變數。

在 JavaScript 中, 作用域為可存取變量,對象,函數的集合。

JavaScript 函數作用域: 作用域在函數內修改。


在JavaScript中,用var申明的變數其實是有作用域的。

如果一個變數在函數體內部申明,則該變數的作用域為整個函數體,在函數體外不可引用該變數:

'use strict';function foo () {
   var x = 1;
   x = x + 1;
}
##x = x + 2; // ReferenceError!無法在函數體外引用變數x

如果兩個不同的函數各自申明了同一個變量,那麼該變數只在各自的函數體內運作。換句話說,不同函數內部的同名變數互相獨立,不影響:

'use strict';function foo() {    var x = 1;
   x = x + 1;
}function bar() {
   var x = 'A';
   x = x + 'B';
}

#JavaScript局部作用域

變數在函數內聲明,變數為局部作用域。

局部變數:只能在函數內部存取。

// 此處無法呼叫carName 變數
function myFunction() {
    var carName = "Volvo";
  // 函數內可呼叫carName 變數
#}

注意:

因為局部變數只作用於函數內,所以不同的函數可以使用相同名稱的變數。

局部變數在函數開始執行時創建,函數執行完後局部變數會自動銷毀。

全域作用域#

不在任何函數內定義的變數就具有全域作用域。實際上,JavaScript預設有一個全域物件window,全域作用域的變數實際上被綁定到window的一個屬性:

'use strict';

##var course = 'Learn JavaScript';

alert(course); // 'Learn JavaScript'

alert(window. course); // 'Learn JavaScript'

因此,直接存取全域變數course和存取window.course是完全一樣的。

<!DOCTYPE html>
<html>
<head> 
<meta charset="utf-8"> 
<title>php中文网(php.cn)</title> 
</head>
<body>
<p>全局变量在任何脚本和函数内均可访问。</p>
<p id="demo"></p>
<script>
var carName = "Volvo";
myFunction();
function myFunction() 
{
    document.getElementById("demo").innerHTML =
"这里是 " + carName;
}
</script>
</body>
</html>

JavaScript 變數生命週期

JavaScript 變數生命週期在它宣告時初始化。

局部變數在函數執行完畢後銷毀。

全域變數在頁面關閉後銷毀。

函數參數

函數參數只在函數內作用,是局部變數。


繼續學習
||
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文网(php.cn)</title> <script type="text/javascript"> var a =1; function test(){ alert(a); //a为undefined! 这个a并不是全局变量,这是因为在function scope里已经声明了(函数体倒数第4行)一个重名的局部变量, //所以全局变量a被覆盖了,这说明了Javascript在执行前会对整个脚本文件的定义部分做完整分析,所以在函数test()执行前, //函数体中的变量a就被指向内部的局部变量.而不是指向外部的全局变量. 但这时a只有声明,还没赋值,所以输出undefined。 a=4 alert(a); //a为4,没悬念了吧? 这里的a还是局部变量哦! var a; //局部变量a在这行声明 alert(a); //a还是为4,这是因为之前已把4赋给a了 } test(); alert(a); //a为1,这里并不在function scope内,a的值为全局变量的值 </script> </head> <body> </body> </html>