本篇分为三章节来说,主要从下面几个点讲起javascript
让咱们先看一段代码java
var a = true; function hoisting(){ if(!a){ var a = 2; } console.log(a) } hoisting(); // 最终结果:2
这段代码的逻辑是闭包
函数域
中的变量。那么咱们能够改写为函数
var a; // 变量声明 a = true; // 变量定义 function hoisting(){ var a; // 变量声明 if(!a){ a = 2; //变量定义 } console.log(a) // 先从自身函数域开始查找,找不到再去父做用域 } hoisting();
javascript的变量是以函数为做用域而存在的,当本地查找不到时会去父级查找。code
可能和本文关系不大~~,主要是闭包构建新的函数域。ip
当即执行函数表达式:Immediately Invoked Function Expression作用域
他的做用就是在变量被调用以前就给变量赋值io
var a = (function(){ var a = 3 return a }())
let与const主要做用是讲javascript原来的函数级做用域调整到块级做用域console
let a = 2; function block(){ if(!a){ let a =1 } console.log(a) } block() // 2
这个时候,函数的做用域就被划分的更小了,以块级为单位。function
咱们能够将代码分红三个块
好,如今咱们改写一下函数会怎样呢
let a = 0; function block(){ if(!a){ let a =1 } console.log(a) } block() // 0
最终结果是0,当a在当前块block查找不到的时候会去父级块查找,最后为0
而if块内的变量只在块内有效