var关于变量提升

var a;
console.log(a === undefined);
a=10;
function foo() {
  console.log([a,i]);
  var a=20;
  for(var i=0;i<a;i++) {
    //do
  }
  console.log([a,i])
}
foo();

输出结果

true
[undefined, undefined]
[20, 20]

JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。

例子

console.log(a);
var a =1;

以上语句并不会报错,只是提示undefined。实际运行过程:

var a;
console.log(a);
a =1;

表示变量a已声明,但还未赋值。但是变量提升只对var命令声明的变量有效,如果一个变量不是用var命令声明的,就不会发生变量提升。

console.log(aa);
aa =1;

以上代码将会报错:ReferenceError: aa is not defined.

与普通变量一样,js里的function也可看做变量,也存在变量提升情况:

a();

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

表面上,上面代码好像在声明之前就调用了函数a。但是实际上,由于“变量提升”,函数a定义部分被提升到了代码头部,也就是在调用之前已经声明了。但是,如果采用赋值语句定义函数,JavaScript就会报错:

a();

var a = function(){
    console.log(1);
};

// TypeError: a is not a function

因为,实际运行过程:

var a;
a();
a = function(){
    console.log(1);
};

这时候a是个变量,并非function。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • let 命令 块级作用域 const 命令 顶层对象的属性 global 对象 let 命令 基本用法 ES6 新...
    嘉奇呦_nice阅读 5,531评论 0 2
  • 《ijs》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 10,814评论 0 7
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 12,383评论 2 17
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,954评论 18 399
  • 开始Java机器学习的最好工具是什么? 这个问题已经有一段时间了,但最近这些日子几乎每个人都在谈论人工智能和机器学...
    尚学先生阅读 3,649评论 0 5