变量声明前置与函数声明前置

变量声明前置 变量声明出现在代码中的任何位置都会在该代码执行前处理,这意味着变量可以在声明之前使用,这个行为叫"hoisting",即把在指定作用域内声明的变量提升到函数或全局代码的顶部。
声明变量的作用域限制在其声明位置的上下文中,而未声明变量总是全局的,所以总在作用域最开始声明变量可以使变量的作用域变得清晰。
示例:

console.log(a); // undefined var a= 1; console.log(b); //Referencerror: b is not deined

  • 由上到下执行代码之前,解析器会先找到var关键字,找到了var a ,就提升var a 并将a初始化为undefined
  • 再由上往下执行,读到console.log(a),控制台打印出来的就是undefined。
  • 接着给变量a赋值,如果这个时候在后面加console.log(a),那么控制台打印出来的就是1.
  • console.log(b),在前面没有对b进行声明,所以报错。
    变量会在代码执行之前就创建,初始化并赋值undefined
    变量的声明会提升,变量的赋值不会提升
函数声明前置
使用function关键字可以声明一个函数,他的特征是函数声明提升,执行代码之前会读取函数声明,即声明不必放在调用的前面,可以放在作用域的任何位置。
a(); function a(){ console.log(''hello'') }

以上代码没有return,返回值undefined
a(); function a(){ return(''hello'') }

【变量声明前置与函数声明前置】以上代码返回值''hello''
JS引擎的过程
  • 扎到所有用function声明的函数,在环境中创建这些函数
  • 将这些函数初始化并赋值为function(){}
  • 开始执行代码a()
    函数提升的优先级高于变量提升的优先级

    推荐阅读