标签:
function Main(){
if(1==1){
var name = ‘seven‘;
}
console.log(name);
}
// 输出: seven
function Main(){
var innerValue = ‘seven‘;
}
Main();
console.log(innerValue);
// 报错:Uncaught ReferenceError: innerValue is not defined
xo = ‘alex‘;
function Func(){
var xo = "seven";
function inner(){
var xo = ‘alvin‘;
console.log(xo);
}
inner();
}
Func();

xo = ‘alex‘;
function Func(){
var xo = "seven";
function inner(){
console.log(xo);
}
return inner;
}
var ret = Func();
ret();
// 输出结果: seven
上述代码,在函数被调用之前作用域链已经存在:
上述代码,在函数被调用之前作用域链已经存在:
当执行【ret();】时,由于其代指的是inner函数,此函数的作用域链在执行之前已经被定义为:全局作用域 -> Func函数作用域 -> inner函数作用域,所以,在执行【ret();】时,会根据已经存在的作用域链去寻找变量。
xo = ‘alex‘;
function Func(){
var xo = "eirc";
function inner(){
console.log(xo);
}
xo = ‘seven‘;
return inner;
}
var ret = Func();
ret();
// 输出结果: seven
上述代码和示例一的目的相同,也是强调在函数被调用之前作用域链已经存在:
不同的时,在执行【var ret = Func();】时,Func作用域中的xo变量的值已经由 “eric” 被重置为 “seven”,所以之后再执行【ret();】时,就只能找到“seven”。
xo = ‘alex‘;<br>
function Bar(){
console.log(xo);
}
function Func(){
var xo = "seven";
return Bar;
}
var ret = Func();
ret();
// 输出结果: alex
上述代码,在函数被执行之前已经创建了两条作用域链:
当执行【ret();】时,ret代指的Bar函数,而Bar函数的作用域链已经存在:全局作用域 -> Bar函数作用域,所以,执行时会根据已经存在的作用域链去寻找。
console.log(xxoo); // 报错:Uncaught ReferenceError: xxoo is not defined
var xxoo; console.log(xxoo); // 输出:undefined
而如果这么写
function Foo(){
console.log(xo);
var xo = ‘seven‘;
}
Foo();
// 输出:undefined
上述代码,不报错而是输出undefined,其原因是:JavaScript的函数在被执行之前,会将其中的变量全部声明,而不赋值,所以,相当于上述实例中,函数在‘预编译’时,已经执行了var xo;所以上述代码中输出的是undefined
def main():
if True:
name = ‘seven‘
print(name)
main()
#seven
def Main():
inner = ‘seven‘
Main()
print(inner)
#NameError: name ‘inner‘ is not defined
name = ‘alex‘
def func():
name = ‘seven‘
def inner():
name = ‘eric‘
print(name)
inner()
func()
#eric
name = ‘alex‘
def func():
name = ‘seven‘
def inner():
print(name)
return inner
ret = func()
ret()
#seven
name = ‘alex‘
def bar():
print(name)
def func():
name = ‘seven‘
return bar
ret = func()
ret()
#alex
当内部作用域想修改外部作用域的变量时
#全局作用域
count = 10
def outer():
global count
print(count)
count = 100
print(count)
outer()
# 10
# 100
#嵌套作用域
def outer():
count = 10
def inner():
nonlocal count
count = 20
print(count)
inner()
print(count)
outer()
# 20
# 20
标签:
原文地址:http://www.cnblogs.com/xinsiwei18/p/5925700.html