前言: 這是每天看github上面的一位大佬 "冴羽" [的博客 自己加以自己的理解總結的 是指程式源碼中定義變數的區域 作用域決定瞭如何查找變數,也就是度額定當前執行代碼對變數的訪問許可權 JavaScript 使用的是 (lexical scoping) 也就是靜態作用域 靜態作用域與動態作用 ...
前言:
這是每天看github上面的一位大佬 冴羽[的博客 自己加以自己的理解總結的
作用域
是指程式源碼中定義變數的區域
作用域決定瞭如何查找變數,也就是度額定當前執行代碼對變數的訪問許可權
JavaScript 使用的是 詞法作用域
(lexical scoping) 也就是靜態作用域
靜態作用域與動態作用域
因為JavaScript採用的是詞法作用域,函數的作用域在函數定義的時候就決定了
而與詞法作用域相對的是動態作用域
函數的作用域是在函數被調用的時候決定的
var value = 1;
function foo() {
console.log(value);
}
function bar() {
var value = 2;
foo();
}
bar();
//這裡列印的是什麼 1? 2?
靜態作用域:
執行 foo()函數內部作用域找value 找不到 在全局變數裡面找 找到了 列印出 1
動態作用域
執行 foo() 函數內部作用域找value 找不到 進入調用函數(bar)作用域 找到了value 列印 2
因為js是靜態作用域所以這裡是1
這裡參照《JavaScript權威指南》 P183
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f();
}
checkscope();
假如理解了JavaScript的靜態作用域 可以很輕易的判斷出 這裡列印的是 '局部變數' local scope
那麼這裡我們返回函數內嵌套的一個函數對象 而不是直接返回結果
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f;
}
checkscope()();
依舊是 "local scope"
JavaScript函數的執行用到了作用域鏈
,這個作用域鏈是函數定義的時候創建,嵌套的函數f()定義在這個作用域鏈上面,裡面的變數scope一定是局部變數,,不管什麼情況下執行f() 局部變數的綁定依舊有效,,因此列印出來依舊是
local scope
下一篇會以執行上下文來解讀這段代碼 究竟在運行上面什麼地方不相同