作用域 就是你能訪問到的變數、物件以及函式的集合。
JavaScript 有兩種類型的作用域:全域 以及 區域。函式外宣告的變數是一個 全域 變數,它的值可以在整個程式中被存取和修改。函式內宣告的變數是 區域 的,它隨著函式的呼叫而被建立,再隨著函式的結束而被銷毀。它不能在函式以外被存取。
在函式中定義的函式,也叫巢狀函式,可以存取到外層函式的作用域。
注意下面的程式碼:
var a = 4; // a 是一個全域變數,它可以被下面的函式存取
function foo() {
var b = a * 3; // b 不能夠在 foo 函式以外被存取,但是可以被定義於 foo 內部的其他函式存取
function bar(c) {
var b = 2; // 另一個新的 `b` 變數被建立在 bar 函式的作用域內
// 對這個新的 `b` 變數的改變並不會影響到舊的 `b` 變數
console.log( a, b, c );
}
bar(b * 4);
}
foo(); // 4, 2, 48立即函式(IIFE, Immediately Invoked Function Expression)是用來建立區域作用域的常用方法。 範例:
(function(){ // 這個函式語法被一組小括號括起來
// 在這裡定義的變數
// 不能夠在這個函式外被存取
})(); // 這個函式立即被執行建立一個名為 scope.js 的檔案。
在該檔案中複製貼上以下的程式碼:
var a = 1, b = 2, c = 3;
(function firstFunction(){
var b = 5, c = 6;
(function secondFunction(){
var b = 8;
(function thirdFunction(){
var a = 7, c = 9;
(function fourthFunction(){
var a = 1, c = 8;
})();
})();
})();
})();依你對 作用域 的理解,將下面這段程式碼插入上述程式碼裡,使得程式碼的輸出為 a: 1, b: 8,c: 6。
console.log("a: "+a+", b: "+b+", c: "+c);