作用域是什么?

124 阅读2分钟

js中什么是作用域

作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性。作用域决定了代码区块中变量和其他资源的可见性。

在es5中JavaScript有全局作用域和函数作用域

全局作用域

全局作用域(全局词法环境)变量和函数都在window这个全局对象中。

何时产生全局作用域:当代码执行到script标签时,就会产生一个全局的词法环境。全局词法环境中有一个对象(window)。这个对象将全局作用域中的变量和函数(内置函数、自定义函数)存到windo中。

例如在script标签内声明一个变量和函数:

q.png

输出window看到全局作用域所有变量及函数,也能找到声明的变量和函数。当页面关闭时,全局变量和函数就会销毁。

注:全局作用域有个弊端:如果我们写了很多行 JS 代码,变量定义都没有用函数包括,那么它们就全部都在全局作用域中。这样就会 污染全局命名空间, 容易引起命名冲突。

局部作用域(函数作用域)

局部作用域也有一个类似于window的对象,用来存储函数中的变量和方法。函数作用域,是指声明在函数内部的变量,和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部。

    function fun() {
        var str = '局部作用域';
        function fun1() {
            alert(str);
        }
        fun1()
    }
    fun();//弹出提示框 局部作用域
    alert(str);//脚本错误
    fun1();//脚本错误

作用域是分层的,内层作用域可以访问外层作用域的变量,反之则不行。

重要事项: 在函数作用域中,未定义直接赋值的变量变量时,该变量为一个全局变量

2w.png

        function fun() {
            var a = b = 10;//从右边往左执行,b = 10;(全局变量) var a = b;
            var c = 15, d = 15;//从左往右执行,var c = 15; var d = 15;
        }
        fun();
        console.log(a);//undefined 报错
        console.log(b);// 10
        console.log(c);//undefined 报错
        console.log(d);//undefined 报错