一步一步重温 JavaScript 基础系列。
本章节将会理解JS的变量和函数的声明方式和异同,以及其优先级
定义变量
var
会直接在栈内存里预分配内存空间,然后等到实际语句执行的时候,再存储对应的变量,如果传的是引用类型,那么会在堆内存里开辟一个内存空间存储实际内容,栈内存会存储一个指向堆内存的指针。
- 定义的变量没有赋值时,默认初始化为undefined
- 没有块级作用域
- 存在变量声明提升
- 可以反复声明和赋值
let
是不会在栈内存里预分配内存空间,而且在栈内存分配变量时,做一个检查,如果已经有相同变量名存在就会报错。
- 有块级作用域,只在声明所在的块级作用域内有效
- 没有变量声明提升
- 不可重复声明
const 常量
声明常量,也不会预分配内存空间,在栈内存分配变量时也会做同样的检查。不过const存储的变量是不可修改的,对于基本类型来说你无法修改定义的值,对于引用类型来说你无法修改栈内存里分配的指针,但是你可以修改指针指向的对象里面的属性。
- 有块级作用域,只在声明所在的块级作用域内有效
- 没有变量声明提升
- 不可重复声明
- 声明时必须初始化赋值
(以上非原创)链接:https://www.jianshu.com/p/12c186deb6fe
定义函数
函数声明
1 | function foo (){ |
函数表达式
1 | 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
20var 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();函数声明,如果有同名属性,后面会替换前面