作用域&js分号的作用
2021-05-19 本文已影响0人
3e2235c61b99
var b = 10;
(function b(){
b = 20;
console.log(b);
})();
以上代码输出为:
ƒ b(){
b = 20;
console.log(b);
}
原因:
作用域:执行上下文中包含作用域链
在理解作用域链之前,先介绍一下作用域,作用域可以理解为执行上下文中申明的变量和作用的范围;包括块级作用域函数作用域
特性:声明提前:一个声明在函数体内都是可见的,函数声明优先于变量声明;
在非匿名自执行函数中,函数变量为只读状态且无法修改(非匿名自执行函数,函数名只读)
把上面的代码做一些小改动,可以实现输出10和20
var b = 10;
(function b(){
var b = 20;
console.log(this.b); // 10, 此处this为window对象,所以this.b 就是window.n
console.log(b); // 20
})();
var a = 5;
(function() {
console.log(a)
})()
上面的代码可以正常输出5
,但是下面的代码不能正常执行,会报错5 is not a function
,原因是var a = 5
后面没有加;
,javascript解析器把5
当成了一个函数去解析
var a = 5
(function() {
console.log(a)
})()
上面的代码被解析为:
var a = 5(function() {
console.log(a)
})()
其中function() { console.log(a) }
被当成了函数5
的参数,所以会报错
以上参考自 js分号的重要性