词法作用域与动态作用域

JavaScript 采用的是词法作用域(lexical scoping)

JavaScript 函数的作用域在函数定义的时候就确定了,所以实际使用的值与函数定义位置有关系。

1
2
3
4
5
6
7
8
9
10
11
12
let value = 1

function foo() {
console.log(value)
}

function bar() {
let value = 2
foo()
}

bar() // 1

上面这个例子中,foo函数中的value向上寻找为在全局定义的1,所以会打印出1

1
2
3
4
5
6
7
8
9
10
11
value=1

function foo(){
echo $value
}

function bar() {
local value=2
foo
}
bar #2

而在bash中,由于是动态作用域,所以会打印出2

一个例子

输出的都会是local

1
2
3
4
5
6
7
8
9
10
11
let text = "global"

let foo = () => {
let text = "local"
let f = () => text
return f()
// return f
}

console.log(foo()) // local
// console.log(foo()()) // local