作用域分为全局作用域 局部作用域 块级作用域
作用域
- 举例
var out='外部变量';
function outfn(){
var indata='内部变量';
function infn() {
console.log(indata)
}
infn()
}
console.log(out)
outfn()
console.log(indata)
输出结果:
外部变量
内部变量
ReferenceError: indata is not defined(indata 并非全局作用局,所以访问不到)
2.举例
function outfn(){
outdata='外部变量';
var indata='内部变量';
}
outfn()
console.log(outdata)
console.log(indata)
输出结果:
外部变量
ReferenceError: indata is not defined
原因:因为js是一种弱语言。对于未定义而赋值的变量会自动变为全局作用域。
3.举例
var indata='外部变量';
var indata='内部变量';
console.log(indata)
输出结果:
内部变量
4.举例
function foo(a){
var b=a*2
function bar(c){
console.log(a,b,c)
}
bar(b*3)
}
foo(2)
输出结果:
2 4 12
5.举例
if(true){
var str=‘qm’
}
console.log(str)
输出结果:
qm
原因:虽然作用域是一层一层的,但是{}会形成块级作用域,但是在使用for if switch 不能像方法一样形成新的作用域
6.举例
for(var i=0;i<10;i++){}
console.log(i)
输出结果:
10
7.举例
for(let i=0;i<10;i++){}
console.log(i)
输出结果:
ReferenceError: i is not defined
作用域链
向父级作用域寻找,如果父级作用域也没有,则在向上一层一层寻找,直到找到全局作用域也没找到,就宣布查找失败。向上一层一层寻找的过程,成为作用域链。
1.举例
var a=1;
function fn1(){
var b=2;
function fn2(){
var c=3;
console.log(a)
console.log(b)
console.log(c)
}
fn2()
}
fn1()
输出结果:
1
2
3
2.举例
if (0) {
console.log('True');
}else{
console.log('False');
}
输出结果:
False
3.
if (1) {
console.log('True');
}else{
console.log('False');
}
输出结果:
True
原因:当数字在逻辑环境中执行时,会自动转为布尔类型。0/-0和NaN会自动转为false,其余数字都被认为是true
4.
if ("") {
console.log('True');
}else{
console.log('False');
}
输出结果:
False
原因:当字符串在逻辑环境中执行时,也会被转为布尔类型。空字符串会被转为false,其它字符串都会转为true
当undefined和null在逻辑环境中执行时,都被认为是false
5.
if (new Boolean(false)) {
console.log('True');
}else{
console.log('False');
}
输出结果:
False