JavaScript 变量提升和函数提升

一、变量提升

在ES6之前,JavaScript没有块级作用域,只有全局作用域和函数作用域。

1.所指的形式:必须有关键字var
2.提升的方式:将变量声明提升到它所在作用域的顶部。
3.示例代码:

console.log(v1);      //undefined
var v1= 'v1 is good';
console.log(v1);     //v1 is good
 
function fn () {
  console.log(a1); // undefined
  var a1= 'a1 is not good';
  console.log(a1); // v1 is good
}
fn();

之所以会是以上的打印结果,是由于js的变量提升,实际上上面的代码是按照以下来执行的:

var v1;               //变量提升,全局作用域范围内,此时只是声明,并没有赋值
console.log(v1);      //undefined
v1= 'v1 is good';     // 此时赋值
console.log(v1);      //v1 is good
 
function fn () {
   var a1;      // 变量提升,函数作用域范围内
  console.log(a1); // undefined
  a1= 'a1 is not good';  
  console.log(a1); // a1 is good
}
fn();

不用关键字,let 和const定义变量,提前使用,会报ReferenceError的错误。


二、函数提升

s中创建函数常见的两种方式:函数声明式和函数字面量式。只有函数声明才存在函数提升!

console.log(f1); // function f1() {}   
console.log(f2); // undefined  
function f1() {}
var f2 = function() {}

函数的提升过程

function f1() {} // 函数提升,整个函数声明代码块提升到当前作用域的顶部 
console.log(f1);   
console.log(f2);   
var f2 = function() {}

你可能感兴趣的:(JavaScript 变量提升和函数提升)