JS中var的底层实现

大家都知道在JS中声明一个变量,可以用var、let、以及const还有直接声明。let和const修饰的是却于作用域和重新定义,
那么用var修饰的变量和直接声明的变量有什么不同呢?

var关键字

var关键字是JS中一种动态数据类型 ,学过JAVA的可能知道,在Java10推出了var关键字,虽然与JS中的具体特性不太一样,JS中可以实现类型间的转换,而JAVA中不能直接转换,但是大体上是相似的一个关键字,用于申请局部变量

var a = 20;
var a =8.9;
在Java中这样的代码会报错 显示intdouble的转换;
Java是强类型语言,每个变量都有固定的变量类型。
而在JS中是可以直接使用以上语句,并且输出后为8.9

JS的var实际上是申请内存的一个操作,就像 var a = 0;其执行操作其实是首先在栈内存中申请到一个变量的空间,让后分配给a,所以,用var声明的变量会在栈内存中有其的位置,

反观不加var修饰的变量,其是直接生成一个属于window的一个属性,比如

var a = 1;
b=2;

其中 a 因为是直接声明的(没有在内部函数或对象中)所以虽然是局部变量,但这个局部指的作用域是全部,而b则是直接在window中添加一个属性b console.log(window.b) //2

1.var 申请内存,浏览器在 解析 遇到var关键字时候会为它声明的变量在栈中分配存储空间,那么遇
到 b = 2; 这类不带var表达式时会认为b已经分配内存了,然后继续解析
2.浏览器执行行流到达 b = 2;时,语句才真正被执行赋值操作,然而我们知道js代码执行中如果曾经没有被var声明过,它会当成window的一个属性,然而window是一个对象,window标识符的值是一个地址存在栈中指向堆内存中一个对象,堆内存又是 动态分配 的,b = 2;对还没分配内存的变量b赋值会为它在堆中分配内存(浏览器解析时候已经将需要分栈内存的变量分配好内存,执行时候除了执行环境变化才会操作栈内存,这也是为什么栈中保存的数据是固定大小的),

看了上面的内容, 下边在说另一种情况验证下

console.log(f); // 报错:f未定义,
console.log(window.f); // undefined  

输出语句是实现获取f的值在打印在控制台的功能,计算机无法通过b对应的地址取到值所以报错,然而对比一下第二句代
码console.log(window.f);输出undefined,f和window.f还是不一样的,window.f执行过程:
a).在window对象中获取f的值,如果没有找到执行下一个过程;
b).设置f的值,没有指定值,默认赋值为undefined,而f;语句并不会调用设值方法,所以错误了

总结:变量和对象有没有定义是指它是否被分配内存,js中 var和赋值操作发生时候,如果操作的变量事先没有定义过,那么将会为该变量分配内存空间;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值