美文网首页
2019-08-13JS里面的作用域Scope

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

作者: 啊_6424 | 来源:发表于2019-08-13 12:49 被阅读0次

    作用域指一个变量的作用范围。

    JS的作用域

    在JS中,有两种作用域

    • 全局作用域
      直接编写在script标签中 JS代码 都在全局作用域
      在页面打开时创建,在页面关闭时销毁。
      在全局作用域中,有一个全局对象window,我们可以直接使用;它代表的是浏览器的窗口,由浏览器创建!
      在全局作用域中,我们创建的变量都会作为window对象的属性保存;创建的函数都会作为window对象的方法保存!(前面已经证实了)
      全局作用中声明的变量叫全局变量,在页面得任意范围都可以访问!

    • 函数作用域
      调用函数时创建函数作用域,函数执行完毕后销毁函数作用域!
      每调用一次函数就会创建一个新的函数作用域,彼此之间是相互独立的!
      在函数作用域中可以访问到全局变量,但是在某个函数作用域里面声明的变量只能在该函数作用域中访问!
      当在作用域中操作一个变量的时候,会先在自己的作用域中查找,如果没有,则向上一级作用域查找

    声明变量

    • 我们声明一个变量要用到var关键字,还有其他方式吗?—— 有
    • 通过window对象
        window.a = 123;
        console.log("a", a);
    
    成功声明

    我们前面学到了在script标签中,调用window对象中的属性和方法是不需要写 window. 的
    所以,可以写成如下形式而不会报错!

        a = 123;
        console.log("a", a);
    

    两种声明方式的区别:推荐用var声明,因为它能提前声明

    var 的声明提前

    我们JS的代码是从前往后运行的。看下面这个例子

        console.log("a", a);
        a = 123;
    
        console.log("a", a);
        var a = 123;
    
    image.png

    不报错的原因

    不报错的原因就是 var 关键字的 声明提前。
    它的解析顺序是如下

        var a
        console.log("a", a);
        a = 123;
    

    函数的声明提前

    使用函数声明形式创建的函数,它的声明也会别提前。

            fn2();
            fn1();
    
            var fn1 = function (){
            //使用函数表达式声明函数
            console.log("fn1");
            }
            function fn2 () {
            //使用函数声明方式声明函数
                console.log("fn2");
            }
    
    image.png

    真实执行顺序如下:

            function fn2 () {
            //使用函数声明方式声明函数
                console.log("fn2");
            }
            var fn1
    
            fn2();
            fn1();
    
            fn1 = function (){
            //使用函数表达式声明函数
                console.log("fn1");
            }
    
    

    相关文章

      网友评论

          本文标题:2019-08-13JS里面的作用域Scope

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