javaScript作用域

作用域:就是代码名字(变量)在某个范围内起作用和效果 目的是为了提高程序的可靠性更重要的是减少命名冲突。

JS的作用域(es6)之前:全局作用域 局部作用域

1.全局作用域:整个script标签 或者是一个单独的js文件

var num = 10;

2.局部作用域(也称为函数作用域):在函数内部就是局部作用域 这个代码的名字只在函数内部起效果和作用。

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

变量的作用域

变量作用域:根据作用域的不同我们变量分为全局变量局部变量

1.全局变量:在全局作用域下的变量 在全局下都可以使用

注意:如果在函数内部 没有声明直接赋值的变量也属于全局变量

var num = 10; //num就是一个全局变量
console.log(num);
function fn() {
    console.log(num); 
}
fn();

2.局部变量 在局部作用域下的变量 或者在函数内部的变量就是 局部变量

function fun() {
    var num1 = 10; //num1就是局部变量 只能在函数内部使用
    num2 = 20; // 在函数内部没有声明直接赋值是全局变量
}
fun();

注意:函数的形参实际上就是局部变量

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

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

JS没有块级作用域(了解)

块级作用域由 {} 包括。

在其他编程语言中如:Java、C#等,在if语句、循环语句中创建的变量,仅仅只能在if语句、本循环语句中使用,如下面的Java代码:

Java有块级作用域:

if (true) {
    int num = 123;
    system.out.print(num); // 123
}
    system.out.print(num); // 报错 

​ 以上Java代码会报错,是因为代码中 {} 即一块作用域,其中声明的变量 num ,在“ {} ” 之外不能使用;而与之类似的javaScript代码,则不会报错。

JS中没有块级作用域(在ES6之前)

if (true) {
    var num = 123;
    console.log(123); // 123
}
console.log(123); // 123

作用域链

  • 只要是代码,就至少有一个作用域
  • 写在函数内部的是局部作用域
  • 如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域
  • 根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链
var num = 10;
function fn() { // 外部函数
    var num = 20;
    funtion fun() { // 内部函数
        console.log(num); // 20
    }
    fun();
}
fn();
文章目录