这篇文章主要讲解了“JS变量中有var定义和无var定义的区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS变量中有var定义和无var定义的区别”吧!
之前我们在写js代码的时候都知道可以用var定义全局变量和局部变量,也可以省略var,而且在非严格模式下不会报错,但是并不知道两者的区别...
var x = 1; y = 4; console.log(x);//1 console.log(y);//4 console.log(window.x);//1 console.log(window.y);//4
简单测试下可以知道定义的x和y都被挂载在window对象上,变为window下的属性,这并不能说明什么...
delete x; delete y; console.log(window.x);//1 console.log(window.y);//undefined
再看看执行上面代码之后x属性没有被删除,y被删除了,这是区别就来了
在通过var进行定义后的变量不能被delete删除,这是什么原因?ECMAScript 5标准中,可以通过Object.getOwnPropertyDescriptor()来获取对象自身某个property的属性信息:
console.log(Object.getOwnPropertyDescriptor(window,"x")); console.log(Object.getOwnPropertyDescriptor(window,"y"));
得到如下信息:
当不使用var进行定义是,变量默认的configurable为true,可以进行delete等命令进行操作,而当var在定义一个全局变量的时候configurable 变为了false,即不会被delete删除.
此外,简单说一下关于变量提升问题
alert(a);//Uncaught ReferenceError: a is not defined a = 100;alert(b);//undefined
var b = 200;先说第二段代码,var声明的全局变量b在js中会进行代码提升,也就是说var b = 200;会被分解为var b;b=200;代码解析的第时候会将var b;提升到最前面,并且在内存中开辟一个空间,由于b没有被赋值,默认为undefined.第一段代码中当js执行alert()函数时候由于没有进行var声明,变量没有被提升,不存在内存开辟,所以在alert时候直接报错!
在ECMAScript6标准中,一个重要的概念就是"JavaScript严格模式",需要在最前面加上"use strict";
let注意点:
1.let拥有块级作用域,一个{}就是一个作用域
2.let在其作用域下面不存在变量提升
3.let在其作用域中不能被重复声明(函数作用域和块级作用域)
第一点:let的块级作用域
注意:以下代码都在严格模式下执行的
let n = 10; if(true){ let n = 50; } console.log(n);//10表示外层代码块不受内层代码块的影响,如果是用var定义的变量n,那么输出的就是修改后的50.
第二点:变量提升问题
alert(a);//Uncaught ReferenceError: a is not defined let a = 100;
不同var,let不存在变量提升,以上写法会直接报错.
第三点:重复声明问题
(function(){ let lTest = "let"; var vTest = "var" let lTest = "let changed";//Uncaught SyntaxError: Identifier 'lTest' has already been declared var vTest = "var changed"; console.log(lTest); console.log(vTest); })();
let在同一个作用域下不允许进行重复变量声明.否则也是直接报错!!!
const命令
const用来声明常量,一旦声明,其值就不可以更改,如果你非得修改变量的值,js不会报错,只是默默表示失败(不起作用)
const的作用域与let相同,只在声明所在的块级作用域内有效,并且也是和let一样不可以重复进行声明.
感谢各位的阅读,以上就是“JS变量中有var定义和无var定义的区别”的内容了,经过本文的学习后,相信大家对JS变量中有var定义和无var定义的区别这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。