JS变量中有var定义和无var定义的区别以及es6中let命令和const命令

作者:jian_xi 时间:2024-05-22 10:37:29 

 之前我们在写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"));

得到如下信息:

JS变量中有var定义和无var定义的区别以及es6中let命令和const命令

当不使用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一样不可以重复进行声明.

来源:http://blog.csdn.net/jian_xi/article/details/55803871

标签:js,var,let,const
0
投稿

猜你喜欢

  • ASP动态包含文件的改进方法

    2009-01-05 12:22:00
  • 对pandas通过索引提取dataframe的行方法详解

    2021-05-18 18:10:39
  • python使用原始套接字发送二层包(链路层帧)的方法

    2022-06-30 04:14:48
  • 网页设计中HTML常范的五个错误

    2008-04-22 18:14:00
  • Vue Router根据后台数据加载不同的组件实现

    2023-07-02 16:59:14
  • python神经网络Keras GhostNet模型的实现

    2022-05-16 17:19:42
  • git如何还原到某次commit并强制推送远程

    2022-07-25 16:45:40
  • python自动统计zabbix系统监控覆盖率的示例代码

    2023-11-14 08:23:03
  • Python建立Map写Excel表实例解析

    2023-05-01 02:10:26
  • MySQL中的多字段相同数据去重复

    2024-01-17 11:21:21
  • python入门之语句(if语句、while语句、for语句)

    2022-01-25 20:01:07
  • 网站注册那些事儿

    2010-01-05 16:49:00
  • CentOS系统中PHP和MySQL的升级方法

    2023-11-20 21:04:19
  • python读取html中指定元素生成excle文件示例

    2021-04-08 19:51:11
  • php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)

    2023-10-17 14:16:56
  • Python+matplotlib调用随机函数生成变化图形

    2023-03-19 09:00:38
  • 以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法

    2022-02-15 19:11:48
  • Python对象类型及其运算方法(详解)

    2023-08-30 09:11:59
  • 最简洁的SQL多重查询的解决方案

    2005-09-12 16:31:00
  • Python中import机制详解

    2023-08-25 10:30:29
  • asp之家 网络编程 m.aspxhome.com