1、以函数作为作用域(除了let)
其他语言:以代码块作为作用域
public void func() {
if (1 == 1) {
String name = "java";
}
System.out.println(name);
}
func();
// 报错
Python:以函数作为作用域
情况一:
def func():
if 1 == 1:
name = "kobe"
print(name)
func()
// 成功
情况二:
def func():
if 1 == 1:
name = "kobe"
print(name)
func()
print(name)
// 报错
JavaScript:以函数作为作用域
function func(){
if (1 == 1){
var name = "kobe"
}
console.log(name);
}
func();
2、函数作用域在函数未被调用之前,已经创建
function func(){
if (1 == 1){
var name = "kobe"
}
console.log(name);
}
此函数未被调用,但是解释器在解释编译时作用域已经创建了
3、函数的作用域存在作用域链,并且也是在被调用之前创建
xo = "kobe";
function func(){
var xo = "eric";
function inner() {
console.log(xo);
}
}
func();
返回eric
xo = "kobe";
function func(){
var xo = "eric";
function inner() {
console.log(xo);
}
return inner;
}
// 返回的是inner函数,而非返回值
var ret = func();
ret()
返回eric
xo = "kobe";
function func(){
var xo = "eric";
function inner() {
console.log(xo);
}
var xo = "tony";
var xo = "mat";
return inner;
}
var ret = func();
ret()
返回mat
4、函数内局部变量提前声明
function func() {
console.log(xxoo);
var xxoo = "mat"
}
func();
返回undefined。
xxoo已经声明,但是还未赋值,即未被定义