美文网首页
JS中带var和不带var的区别

JS中带var和不带var的区别

作者: _hider | 来源:发表于2020-12-20 22:16 被阅读0次

以下案例是给变量a和变量b赋值,只是变量bvar,而变量a没有,分析下两者的区别:

//声明变量 a 不带 var
console.log(a); // Uncaught ReferenceError: a is not defined
console.log(window.a); // undefined
console.log("a" in window); // false
a = 1;
console.log(a); // 1
console.log(window.a); // 1
console.log("a" in window); // true 

//声明变量`b`带`var`:
console.log(b); // undefined
console.log("b" in window); // true
console.log(window.b); // undefined
var b = 2;
console.log(b); // 2
console.log(window.b); // 2
console.log("b" in window); // true
只有带var的变量才会变量提升

在变量提升阶段,变量b提升,默认为undefined,所以代码开始输出变量b
的时候是undefined,因为变量a没有用var,直接赋值为1,所以不会变量提升导致输出变量a的时候直接报错。

不加var的本质是window的属性

当执行a = 1时,浏览器在解析时会认为这是简化写法,会在a前加window,相当于给window.a = 1。所以在a = 1之前输出"a" in window是不存在的,当执行了a = 1就有值了。
那为何在var a = 1之前输出"a" in window是存在的呢?因为存在映射机制。

全局变量和window中的属性存在映射机制

映射机制就是全局作用域下声明一个变量,也相当于给window全局对象上设置了一个同样属性,私有作用域中声明的私有变量和window没有关系。
在变量提升阶段,变量b提升,默认为undefined,相当于在window对象上添加了一个属性b,属性值为undefined。在变量b赋值成12的时候,再输出window.b的时候也变成了12

以上是在全局作用域中,如果在函数作用域中声明一个变量带不带var又是否有区别?

function fn() {
    var a = 1;
    b = 2;
    console.log(a);
    console.log(b);
}
fn();
console.log("b" in window); // true
console.log(window.b); // 2

在函数作用域有ab两个变量,a变量声明带var,它是私有变量,只对当前作用域有效,和全局作用域没关系。要注意的是私有变量是私有作用域中声明的,它不会和window存在映射机制。

之前案例中验证了在全局作用域中不加var的本质是window的属性,那在函数作用域中是否也一样?通过代码可以发现执行完fn后,在全局输出window.b会得到同样的结果,所以不带var不是私有变量,会向他上级作用域查找,在作用域lian7查找的过程中,如果找到window也没有这个变量的话,就会给window设置一个属性。

var a=1 , b=2 和 var a=b=1有什么区别?

JS中经常发现有下面的写法,又分别表示什么意思呢?

var a = 1,
    b = 2;
// 等价于
var a = 1;
var b = 2;
 9
var a = b = 1;
// 等价于
var a = 1;
b = 1;

相关文章

  • JS中带var和不带var的区别

    以下案例是给变量a和变量b赋值,只是变量b带var,而变量a没有,分析下两者的区别: 只有带var的变量才会变量提...

  • 全局作用域下带var和不带var的区别

    在全局作用域中,带var和不带var的关系区别:带var是可以进行预解释,所以在赋值的前面执行不会报错;不带var...

  • 关于js中 带var 、不带var、let、const定义的区别

    声明 以下代码是在非严格模式下测试运行,进入严格模式使用"use strict" delete删除变量时,删除成功...

  • 关于带var和不带var声明变量

    很多时候我们会发现,使用一个变量即使不带var关键字声明,也并不会报错,如 当执行这两者时二者都会同时输出‘1’,...

  • JS 中 var a 与非 var a 的区别

    前段时间开始了JS的学习,第一个重要的知识点就是变量声明及变量声明提升。关于变量声明,有这样两种代码: var a...

  • js基础

    声明变量带var和不带var的区别? 在全局作用域中申明变量相当于给全局对象window增加了一个属性名在全局作用...

  • js 中let 和 var 的区别

    首先我们看一个例子 请问这段代码输出是什么~? 把var换成let呢? 为什么会出现这种情况呢,接下来我们看完le...

  • JS中let和var的区别

    前言 ES6 新增了let命令,用来声明局部变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码...

  • js中var和let的区别

    首先var和let在js中都是变量的标识符,都可以定义一个变量,但二者也有区别,二者区别在于声明的次数。var可以...

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

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

网友评论

      本文标题:JS中带var和不带var的区别

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