一键搞定内网穿透 联行号查询|开户行查询 在线工具箱 藏经阁
当前位置:首页 / 杂记 / 正文
js函数声明变量声明提前

1. 在最外面使用

直接使用未被声明的变量会报错

  1. console.log(aa);

上面代码会报:

  1. Uncaught ReferenceError: aa is not defined

所以正常情况下,我们需要声明一下才能使用

  1. var aa;
  2. console.log(aa);//输出undefind

这样就不会报错了。

js会对var的声明进行前置

可以利用js对var声明可以前置的特性,以下写法也是可以的:

  1. console.log(aa);
  2. var aa = {};

以上代码会输出

  1. undefined

实际上内部是这样执行的

  1. var aa;
  2. console.log(aa);//因为前面只进行了var声明,前未进行赋值,所以还是输出undefind,
  3. aa = {}

这里并不是把var声明移到了console输出上面一行,而且移到了js代码块的最顶部,如果有多个var声明,会把这些声明都移到顶部。

js对未使用var的赋值不进行前置

  1. console.log(aa);
  2. aa = {};

上面代码还是会报错: Uncaught ReferenceError: aa is not
defined,因为js只对var的声明进行前置。

不管var在什么地方,都会进行前置

  1. console.log(aa);//输出undefind
  2. if (false) {
  3. var aa = {};
  4. }

虽然var写在了if里,并且条件为假,但是js还是会把这进行提前,最后输出undefind,不会报错。

2.在函数里使用

  1. var a= 100;
  2. (function f() {
  3. console.log(a);
  4. if (0) {
  5. var a=200;
  6. }
  7. console.log(a);
  8. })();

上面代码会输出两个undefined,因为函数内声明了一个局部变量a,虽然if条件为假,并且在第一个console.log后面定义的,照样不会报错,这叫声明提前,它等效于在f函数内第一行就先声明一个var
a; 实际示是代码这样执行的:

  1. var a= 100;
  2. (function f() {
  3. var a;
  4. console.log(a);//前面只声明,未定义,所以输出undefind
  5. if (0) {
  6. a=200;
  7. }
  8. console.log(a);//if (0)为假,a=200并被执行,所以还是输出undefind
  9. })();

总结:在函数里使用和在最外面使用是一样的:

  1. -在函数里使用时,会把var声明前置到函数顶部,就算类似if (0) var aa=[];这样写也会被提前,对不使用var的赋值不会提前,
  2. -在最外使用时,会把var声明前置到js块顶部,就算类似if (0) var aa=[];这样写也会被提前,对不使用var的赋值不会提前,