像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'; } 函数从上到下解释时,遇到函数定义,会先把里面所有局部变量先定义一下,但不赋值。 func(); // undefined