javascript变量提升和函数提升

变量提升

Variable hoisting变量提升是js比较有特点的地方,它允许你先使用变量,在其后面再进行变量声明,不会抛出 Uncaught ReferenceError异常。虽然变量被提升到前面,但是它的默认值则是undefind,在引用的时候也使用这个值,知道在其面后进行赋值,在使用时候即为所赎的值。

举个例子:

console.log(x)
//如果后面不定义x 则抛出"ReferenceError: x is not defined
//如果后面对x定义 则打印出undefined
var x = 2


var abc = "abcd";

(function(){
    console.log(abc); //undefined
   var abc = "1234";
  console.log(abc); //"1234"
})()

//上面代码可以这样翻译

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

var abc = "abcd";

(function(){
  var abc;
  console.log(abc); //undefined
  var abc = "1234";
  console.log(abc); //"1234"
})()

基于这个原因,在平时编写代码时候,尽量把变量声明放到代码块最顶层位置,可以使代码结构清晰。
注意的是,在ES6语法中新增的let or const 声明方式,并不支持这种变量提升,强行使用会抛出错误ReferenceError

函数提升

对于函数提升,只用函数的声明被提升,表达式则不会被提升

/* 函数声明 */

foo(); // "bar"

function foo() {
  console.log("bar");
}
/* 函数表达式   表达式定义的函数,称为匿名函数。匿名函数没有函数提升。*/

baz(); // TypeError: baz is not a function
//此时的"baz"相当于一个声明的变量,类型为undefined。
由于baz只是相当于一个变量,因此浏览器认为"baz()"不是一个函数。
var baz = function() {
  console.log("bar2");
};
    原文作者:千年老妖
    原文地址: https://segmentfault.com/a/1190000010158921
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞