美文网首页
js中的作用域

js中的作用域

作者: 土豪码农 | 来源:发表于2019-02-27 08:26 被阅读0次
  • 作用域就是决定变量有效范围
  • 作用域按决定的时期来区分可分为词法作用域动态作用域
    词法作用域: 词法作用域就是作用域是由你在写代码声明时决定的,js是词法作用域
    动态作用域: 动态作用域则是由调用时决定的.
  • 在es6之前,js中的作用域大多数由全局作用域函数作用域组成,es6之后就有了块级作用域
    函数作用域:在函数中会产生一个作用域,可以使内容私有化,规避冲突,避免全局污染
    function test() {
        var a = 0;
        console.log(a); //0
    }
    console.log(a);//a is not defined

块级作用域:在{}之间会产生作用域

    {
        const a = 2;
        console.log(a); //2
    }
    console.log(a); // a is not defined
  • 在之前es5的时候,只有函数作用域,会带来一些比较恶心问题.
    for (var i = 0; i < 20; i++) {
        console.log(i);
    }
    console.log(i); //20 for循环后i还能访问,并且保留在20
    if(false){
        var a = 2; //因为没有块级作用域的存在,var a会被提升到if之前,也就是if里面的代码无论执行不执行都会提升
    }
    console.log(a); //undefined 不是 a is not defined
    for (var i = 0; i < 10; i++) {
        setTimeout(function () {
            console.log(i);  //10个10
        })
    }
//因为没有块级作用域,i的值在{}之间并不会被保留下来,一旦有异步操作,就会拿到异步最后的那个值
  • 变量声明的提升,var 声明变量和function声明函数,声明都会提升到当前作用域的顶端,function优先级比var优先级大,也就是function和var变量名称相同时,function的会把var的覆盖了,只有function的生效了
    test(); //1
    function test() {
        console.log(1);
    }

实际提升

    function test() {
        console.log(1);
    }
    test(); //1
  • es6引进了const和let,两者声明的变量作用域规则就是按照块级作用域来,上面遇到的几个问题,全部用let或const声明,就不会有之前的问题
  • const let 和 var 区别
    const let 没有声明的提升,会产生块级作用域,即使申明全局变量,也不会变为window的一个属性,const和let重复声明会报错
    const和let之间的区别,const基础类型数据不能修改,let可以修改.那const引用类型的变量为何就能修改了?原来变量存储的都是在栈里面的东西,里面能放一些比较小,有固定长度的数据,例如基本类型的数据,但是如果是一个引用类型的,里面放的就是一个指针,指向堆里面内存某一块,那个才是真正存储引用类型数据的地方,所以const监控的只是栈上面存放的东西,只要指针指向的地址不修改,实际数据可以怎么改动都可以.

相关文章

  • 2019-08-13JS里面的作用域Scope

    作用域指一个变量的作用范围。 JS的作用域 在JS中,有两种作用域 全局作用域直接编写在script标签中 JS代...

  • js 闭包

    一、js 作用域 讲闭包首先就要理解 js 的作用域。再 ES5 中,js 有两种作用域,全局作用域和函数作用域(...

  • ES5中JS的作用域和变量提升(hoisting)

    ES5 中JS 的作用域: 在ES5 中,JS 只有两种形式的作用域:全局作用域和函数作用域。 全局作用域全局对象...

  • 干货!月薪80k前端大佬面试笔记:JS闭包解析!

    三点注意事项 JS没有块级作用域,只有全局作用域和局部作用域(函数作用域)。 JS中的作用域链,内部的作用域可以访...

  • 变量作用域

    变量作用域:静态作用域、动态作用域JS变量作用域:JS使用静态作用域JS没有块级作用域(全局作用域、函数作用域等)...

  • JavaScript块级作用域

    块作用域{ }JS中作用域有:全局作用域、函数作用域。没有块作用域的概念。ECMAScript 6(简称ES6)中...

  • JavaScript快速上手:关于闭包的知识分享

    JS中变量的作用域 在理解闭包之前,我们得弄清楚JS中变量的作用域原理,它分为全局作用域和局部作用域,它有一...

  • JS作用域的练习

    Js作用域练习demo1 Js作用域练习demo2 JS作用域练习demo3 JS作用域练习demo4 JS作用域...

  • JavaScript快速上手:关于闭包的知识分享

    01 JS中变量的作用域 在理解闭包之前,我们得弄清楚JS中变量的作用域原理,它分为全局作用域和局部作用域,它有一...

  • JS语法基础整理

    块作用域 : { }JS中作用域有:全局作用域、函数作用域。没有块作用域的概念。ECMAScript 6(简称E...

网友评论

      本文标题:js中的作用域

      本文链接:https://www.haomeiwen.com/subject/tqatuqtx.html