像c c++ c#的作用域是语句块,以{}大括号来区分的,而python和js是以函数来区分作用域的。
如:
================================ 1. 以函数作为作用域 (let除外)================================
其他语言: 以代码块作为作用域
public void Func(){
if(1==1){
string name = 'Java';
}
console.writeline(name);
}
Func()
// 报错
Python: 以函数作为作用域
情况一:
def func():
if 1==1:
name = 'alex'
print(name)
func()
// 成功
情况二:
def func():
if 1==1:
name = 'alex'
print(name)
func()
print(name)
// 报错
JavaScript: 以函数作为作用域
function func(){
if(1==1){
var name = 'alex';
}
console.log(name);
}
func()
================================ 2. 函数的作用域在函数未被调用之前,已经创建,即申明定义函数时创建作用范围 ================================
function func(){
if(1==1){
var name = 'alex';
}
console.log(name);
}
================= 3. 函数的作用域存在作用域链,并且也是在被调用之前创建。即嵌套函数中,越内层函数的变量越优先,依次向外层找,全局也找不到就报错 ==================
示例一:
xo = "alex";
function func(){
// var xo = 'eric';
function inner(){
// var xo = 'tony';
console.log(xo);
}
inner()
}
func()
示例二:
xo = "alex";
function func(){
var xo = 'eric';
function inner(){
console.log(xo);
}
return inner;
}
var ret = func()
ret()
示例三:
xo = "alex";
function func(){
var xo = 'eric';
function inner(){
console.log(xo);
}
var xo = 'tony';
return inner;
}
var ret = func()
ret()
================= 4. 函数内局部变量 声明提前 ==================
function func(){
console.log(xxoo);
}
func();
// 程序直接报错
function func(){
console.log(xxoo);
var xxoo = 'alex';
}
解释过程中:var xxoo;
func();
// undefined