美文网首页
js中声明变量加var和不加var的区别

js中声明变量加var和不加var的区别

作者: 切磋琢磨_FE | 来源:发表于2020-02-23 11:29 被阅读0次

严格模式下,不加var 无法声明变量,会报错 。

我们探讨非严格模式的情况:

先给结论:

1. 不加var声明的全局变量,可以被delete操作符删除。
2. 不加var声明的全局变量,无变量提升。

不加var 无论在什么作用域下,声明的变量都是全局变量。
但是与var 声明的全局变量不同,无var 声明的全局变量可以用delete关键字删除。

考虑如下代码:

    a = '111';
    var b = '222';
    console.log(a)
    console.log('a:', Object.getOwnPropertyDescriptor(window, 'a'));
    console.log('b:', Object.getOwnPropertyDescriptor(window, 'b'));
    delete a;
    delete b;
    console.log(b)
    console.log(a);

运行结果如下:


运行结果

上面代码中 声明的变量a 和变量b 都是全局变量,我们知道全局变量本质是window的属性,所以可以通过Object.getOwnPropertyDescriptor()获取全局变量的属性描述符。显而易见变量a是可删除的,变量b是不可删除的。

关于变量提升

这个很好验证, 考虑如下代码:

console.log(a);  // undefined
console.log(b); //  ReferenceError: b is not defined
b=222;
var a= 111;

结果显而易见,但是 变量b为什么没有声明提升?
这就要涉及到js引擎的编译原理了,js引擎在运行js之前,会对js代码进行预编译,预编译的工作是交个js编译器做的。编译器在遇到 类似 var a = xxx; 这样的语句会执行两个动作:
1.进行LHS查询,不存在a的情况下创建a。
2.生成对a赋值操作的可执行代码(注意,这里只是生成代码,并不执行)。
我猜测,在无var 的情况声明变量 a = xxx; 编译器在执行过程中不会进行第一步操作。

相关文章

  • js中声明变量加var和不加var的区别

    严格模式下,不加var 无法声明变量,会报错 。 我们探讨非严格模式的情况: 先给结论: 1. 不加var声明的全...

  • 2 Scala的基础知识

    Scala的变量声明 在Scala中创建变量的时候,必须使用val或者var var和var的区别 var:变量值...

  • 不使用var定义的变量

    js变量 JavaScript声明变量可以用var声明,也可以不用var声明,两种声明变量的方式有什么区别呢? 注...

  • 变量

    变量声明 js 中变量声明时使用 var , let 或 const 其中之一进行修饰。虽然变量声明时可以不加修饰...

  • 前端面试之ES6

    var、let 和 const的区别 var变量var 声明的变量会被提升到作用域的顶部var 声明的变量会被挂载...

  • 日常小笔记

    1. 浅谈 JavaScript 中定义变量时有无 var 声明的区别在函数作用域内 加 var 定义的变量是局部...

  • 20190301 es6学习—let和const命令

    let命令 let与var之间的不同 声明变量的作用域 作用:声明变量 类似var与var的区别:var声明的变量...

  • javascript中变量前边有var和没有var的区别

    在日常的js开发中,我们经常会遇到这样的事情,当变量前加var和不加var好像对程序的运行没什么影响,那到底加va...

  • JS var、let、const对比

    JS原先声明变量使用var;ES6中引入let和const用来扩展声明变量 (1)使用var声明的变量,作用域为该...

  • js变量声明中var和let区别

    var和let(ES6语法) 区别: 1.通过var来声明的变量,可以重复声明,let不可以2.通过var来声明的...

网友评论

      本文标题:js中声明变量加var和不加var的区别

      本文链接:https://www.haomeiwen.com/subject/wpgdqhtx.html