美文网首页
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