非常全的作用域

64 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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
*/