开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第26天,点击查看活动详情
作用域
js的作用域分为全局作用域和局部作用域
-
局部作用域:作用于函数内部,如函数的形参,只在函数内部有效,在函数外无效。也称函数作用域。这里函数的形参也是局部变量
-
全局作用域:是作用于整个script标签的,但它与局部作用域不影响的,全局变量在任何代码中都可以使用
//这个就就存在了全局
var a = 'a';
function fn() {
console.log(a);
}
console.log(a);
fn();
//当我们在内部定义的时候只能在内部访问
function fn() {
var b = 'b';
console.log(b);//可以访问
}
console.log(b);//这个是访问不到的
fn();
全局作用域看起来很简单,但也存在问题,看如下:
for(var i = 0; i < 10; i++) {
}
console.log(i); //10
我们在for循环内部去定义,外部居然可以访问到,这是因为ES5没有块级作用域的概念,var就说明是泄露在全局
块级作用域
function fn() {
let n = 5;
if(true) {
let n = 10;
console.log(n);
}
console.log(n)
}
fn();
结果就是依次会打印 10 5,也就说明块级作用域不会泄露全局
for (let i = 0; i < 10; i++) {
setTimeout(() => {
console.log(i);
}, i * 1000)
}
//会依次打印 0-9
块级作用域不能变量提升
console.log(a); // ReferenceError
let a = 2;
作用域的预解析、从我们页面开始打卡就开始进行预解析,但是只会解析全局的作用域
局部预解析
var a = 1; //全局变量,解析
function fn() { //会被解析
console.log('晚上好'); //不会被解析,只有等函数被执行之后才会会解析
}
fn(); //到了这里才开始解析函数内部
fn();
var fn = 10;
function fn() {
fn = 20;
}
console.log(fn);
/****
*开始预解析
* var一个变量fn 等于10
* 函数体 fn
* 执行代码
* 调用fn函数 fn = 20,此时为全局变量
* 执行下一行, fn为10,覆盖fn为20的
* 最后输出 10
*/