JavaScript—作用域


JavaScript—作用域

通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。

一、作用域(es6之前)

1.全局作用域

在整个script标签或者一个.js文件中。

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

在函数内部,只在函数内部起效果和作用。

var num = 10;
console.log(num);

function ft(){
    var num = 20;
    console.log(num);
};
ft();

以上代码中,两个 ‘num’ 不会冲突。

二、变量的作用域

1.全局变量

在全局作用域下的变量。

※ 在函数内部没有声明而直接赋值的变量也属于全局变量。

2.局部变量

在局部作用域下的变量。(在函数内部的变量)

var num1 = 10;
function ft(){
    var num2 = 20;
    console.log(num1); //①
    console.log(num2); //②
};
ft();
console.log(num1);       //③
console.log(num2);       //④

以上代码中,’num1’ 为全局变量;’num2’ 为局部变量。①②③都可以成功输出,而④则不能成功输出,因为 ‘num2’ 为局部变量,只能在定义它的函数中使用。

函数的形参也可以看作局部变量

3.从执行效率来看全局变量和局部变量

  1. 全局变量只有在浏览器关闭时才会销毁,比较占内存资源;
  2. 局部变量当我们程序执行完毕就会销毁,比较节约内存资源。

三、作用域链

如果在函数中还有函数,那么在这个作用域中就又诞生了一个作用域。

根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作”作用域链“

var num = 10;
function fn(){
    var num = 20;
    function fun(){
        console.log(num);
    };
};

例如,在以上代码中,在函数 ‘fun’ 中使用 ‘console.log’ 输出 ‘num’ ,因为在函数 ‘fun’ 没有声明 ‘num’ 变量,所以会向“上一层”函数 ‘fn’ 中查找,即 ‘num = 20’ ,则控制台输出 ‘20’ ;假如在函数 ‘fn’ 中也没有声明 ‘num’ 变量,则会向函数 ‘fn’ 的上一层查找,即 ‘num = 10’ ,以此类推。(就近原则)


文章作者: Cikian
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Cikian !
评论
  目录