有关(变量/函数)提升的几个代码片段

何为提升

变量或者函数声明都会在任何代码被执行前首先被处理。

一些代码片段的运行结果

a = 2;
var a;
console.log(a);  // 2

说明:对变量a的声明var a会被提升到最顶部。


console.log(a);  // undefined
var a = 2;

说明:JSvar a = 2看作两个声明:var aa = 2。第一个定义声明在编译阶段进行,第二个赋值声明在执行阶段进行。只有定义声明会被提升。


foo();

function foo () {
  console.log(a);  // undefined
  var a = 2;
}

说明:

  • foo的函数声明会被提升,因此第一行foo()可以正常执行
  • var a被提升,赋值操作不会被提升,因此结果是undefined

foo();  // TypeError

var foo = function bar() {
  ...
}

说明:

  • 变量标识符foo()被提升并分配给所在作用域,因此不会导致ReferenceError
  • 但是foo并未赋值,foo()undefined进行函数调用而导致非法操作,因此抛出TypeError异常
  • 函数表达式不会被提升

foo();  // 1

var foo;

function foo() {
  console.log(1);
}

foo = function () {
  console.log(2);
}

说明:

  • 函数声明会被提升到变量声明之前(函数优先)
  • 重复 声明会被忽略掉

foo();  // 3

var foo;

function foo() {
  console.log(1);
}

foo = function () {
  console.log(2);
}

function foo () {
  console.log(3);
}

说明:在之前对基础上,出现在后面对声明还是可以覆盖前面的

你可能感兴趣的:(有关(变量/函数)提升的几个代码片段)