变量声明&函数声明

一步一步重温 JavaScript 基础系列。
本章节将会理解JS的变量和函数的声明方式和异同,以及其优先级

定义变量

var

会直接在栈内存里预分配内存空间,然后等到实际语句执行的时候,再存储对应的变量,如果传的是引用类型,那么会在堆内存里开辟一个内存空间存储实际内容,栈内存会存储一个指向堆内存的指针。

  • 定义的变量没有赋值时,默认初始化为undefined
  • 没有块级作用域
  • 存在变量声明提升
  • 可以反复声明和赋值

let

是不会在栈内存里预分配内存空间,而且在栈内存分配变量时,做一个检查,如果已经有相同变量名存在就会报错。

  • 有块级作用域,只在声明所在的块级作用域内有效
  • 没有变量声明提升
  • 不可重复声明

const 常量

声明常量,也不会预分配内存空间,在栈内存分配变量时也会做同样的检查。不过const存储的变量是不可修改的,对于基本类型来说你无法修改定义的值,对于引用类型来说你无法修改栈内存里分配的指针,但是你可以修改指针指向的对象里面的属性。

  • 有块级作用域,只在声明所在的块级作用域内有效
  • 没有变量声明提升
  • 不可重复声明
  • 声明时必须初始化赋值

(以上非原创)链接:https://www.jianshu.com/p/12c186deb6fe

定义函数

函数声明

1
2
3
function foo (){
// 函数体
}

函数表达式

1
2
3
var foo = function (){
// 函数体
}

可以将用函数表达式定义的函数理解为先声明一个变量,然后赋值为一个函数
注意:函数声明存在函数声明提升,而函数表达式则没有
例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 函数声明-存在函数声明提升
sayHi();
function sayHi() {
alert('Hi')
}
// 此时不会报错,因为函数声明提升,即将函数声明方式定义的函数,放在最先进行读取

// 函数表达式-不存在函数声明提升
sayHi();
var sayHi = function () {
alert('Hi')
}
// 此时会报错,因为变量声明提升,在当前作用域下,先声明一个sayHi,但并未赋值,其值默认为'undefined'
// 一个值为'undefined'的变量,作为函数调用,显然会报错

函数声明和变量声明提升优先级

  • 函数声明优先级高于变量声明,毕竟函数是一等公民

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    var getNum = function(){
    console.log(2);
    }
    function getNum (){
    console.log(1);
    }
    getNum();

    // 打印为2
    // 代码解释如下:
    function getNum (){
    console.log(1);
    }

    var getNum;
    getNum = function(){
    console.log(2);
    }

    getNum();
  • 函数声明,如果有同名属性,后面会替换前面

原创技术分享,您的支持将鼓励我继续创作