JS里加var和不加的区别

console.log(a); // undefined
console.log(b); // b 没有声明--------->这里报错
b = 10;
var a = 20;

***************************************

console.log(a); // undefined
b = 10;
console.log(b); // 10, 代码执行阶段创建
var a = 20;

申明下这都是在非严格模式下进行的
在全局上下文下,b为什么输出会报错,网上说b是一个全局对象的属性并不是全局变量,这是为什么?第二个问题是全局对象是在进入任何执行上下文之前就已经创建了的对象,然后是进入上下文阶段进行变量声明,最后是代码代码执行阶段,但是为什么b只在代码执行阶段才会挂到window下面?

阅读 2.9k
6 个回答

举个直白的例子

 function Example(){
    var a = 1  //此时为局部变量
 }
 
 
 (function(){
     b=1
 })()
 为什么会挂载全局(window)  是因为上面这个代码b其实是赋值   默认全局应该会有var b;这个声明语句

没太看懂题主想问啥,只能说如果b之前没有声明过,那这种写法在非严格模式下会导致jvm帮你声明b,然后再赋值;在严格模式下会直接报错,毕竟没有声明。如果之前b在外层或本层作用域有声明过,那这里只是修改了原先b的值。

建议查查看“严格模式”。

另外好像有听说过jvm在执行一段脚本时会先把里面的变量先声明好,再执行。这段话是我凭印象说的,仅供参考。

b输出当然会报错,因为你在输出的时候还没有声明b,除非你console.log(b = 1),这时才会先帮你声明b,再输出。就算jvm会帮你看一遍代码,发现你底下声明了b,但因此就帮你提前声明b是不符合程序规范的,没有哪个正常的、生产环境下的程序会先使用后声明。

a能被打印是因为变量提升的原因,b没有声明所以会所以会向上一层层找变量名为b的值,由于先前也没有声明过,栈中找不到,所以会报错。
当代码执行到b的时候,没写var,会向上一层一层找是否有定义,如果有则将表达式赋值,如果找到最上层没有对应的变量,则将b作为windows的对象的属性并赋值。

clipboard.png

第二个问题的话我不是太能理解。不知道你说的是不是这个意思:

clipboard.png

一个作为全局变量的obj,在声明之前打印,发现时undefined,
然后声明并赋值,在打印输出{},最后输出的underlined是var obj = new Object()的返回值。
由于变量提升的原因,虽然代码第一行没定义obj,但实际上运行的时候是拆成了这样

var obj = undefined//全局变量声明
console.log(obj)//undefined
obj = new Object()//变量赋值
console.log(obj)//{}

至于b么,在代码中没有对他进行任何声明,当然也不会提升,只是运行到这里的时候会当做b已经在之前的部分已经生命过一样,向上查找,当找到最上层,也就是window对象后,嗯,挂上去XD

  1. 这样看,a声明了,但没有定义

    var a;
    console.log(a); // undefined
    console.log(b); // b 没有声明
    b = 10;
    a = 20;
  2. b没有定义,直接是挂载在window下面的

没写var,js会在当前上下文下寻找该变量,如果没有定义该变量就将它挂载到window中,如果有,就为全局变量。就是这样啦

首先变量初始化阶段,var a,目前只有a.然后才进入代码块执行阶段,console.log(a)是a变量已经存在,值为undefined。b不存在

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题