js关键字 let 和var、querySelector方法和getElementBy方法的比较

目录

一:let 和var的比较

1.1语法规范

1.2变量提升

1.3作用域问题

二:document.querySelector方法和getElementById()方法:

 2.1通过getElementBy家族获得的DOM元素对象会随着DOM元素的更新自动更新

2.1通过querySelector家族获得的DOM元素对象不会自动更新需要手动更新


一:let 和var的比较

1.1语法规范

名称区别
var允许对同一个变量名进行重复声名
let 不允许对同一个变量名进行重复声名

我们执行如下代码

       <script type="text/javascript">
			var b = 10
			var b = 10
			let a = 10
			let a = 15
		</script>

得到的反馈结果为: 'a' has already been declared

实际开发的时候每个变量都应该是相互独立的内存空间,所以重复声名是不合理的

1.2变量提升

关键字变量提升
var
let

变量提升:函数声明和变量声明总是会被解释器悄悄地"提升"到方法体的最顶部。

所以使用var定义的全局变量有变量提升,先使用后声名虽然不会报错。但是因为js是一类弱数据类型的语言,所以在赋值之前该变量的值都会被定义为NAN,这不符合我们的使用习惯。而使用let声名的变量要先声名,后使用,如果在声名之前使用,会直接报错。

l                                

       <script type="text/javascript">
			var b = a + 3
			var a = 10
			console.log(`a+3的值为${a+3}`)
			console.log(`b的值为${b}`)
			let c = d+3
			let d = 10	     
		</script>

控制台反馈结果如下:

                    

       可以看到使用let先使用后定义一个变量的时候,控制台会直接抛出错误提示,使用var先使用后定义一个变量的时候,控制台虽然没有给出错误提示,但是它的值在被赋值之前一值都是NAN,这会造成使用异常。

1.3作用域问题

varlet
函数作用域,全局作用域函数作用域,全局作用域,块级作用域
没有块级作用域有块级作用域

下面通过一个实例来验证他们造成的影响

            给出如下代码

    <body>
		<button type="button">1</button>
		<button type="button">2</button>
		<button type="button">3</button>
		<script type="text/javascript">
		var btnArr = document.querySelectorAll("button")
		  for(var i = 0;i<btnArr.length;i++){
			  console.log(i)
			  btnArr[i].onclick=function(){
				  console.log(i)
			  }
		  }	  
		</script>
	</body>

在调用了三个按钮的点击事件以后,得到如下结果

                       

                       

 可以看到我们打印出来的三次i的值全为3,这是因为i在循环结束以后被当作全局变量保存下来,然后在点击事件里被重新调用了的结果

       把关键字var改为let以后打印输出的结果如下,这是因为这里的i是个块级作用域,只在档次循环有效

                           

 显然第二种方式更符合我们的需求

二:document.querySelector方法和getElementById()方法:

 2.1通过getElementBy家族获得的DOM元素对象会随着DOM元素的更新自动更新

	    div id="box">
			<div class="index"></div>
		</div>	
	
		<script type="text/javascript">
		let box = document.getElementById("box")		
		//得到所有名字为index的类
		let indexArr = document.getElementsByClassName("index")
		// 打印类名为index的数组对象
		 console.log(indexArr)
		//新生成一个类名为index的div,并把它插入DOM文档
		 let index1 = document.createElement("div")
		 index1.className="index"
		 box.appendChild(index1)
		//打印类名为index的数组对象
		 console.log(indexArr)
		</script>

两次的打印结果为

            

 可以看到我们存放类名为index的数组对象自动更新了,前后两次的打印结果不一样

2.1通过querySelector家族获得的DOM元素对象不会自动更新需要手动更新

执行如下代码

        <div id="box">
			<div class="index"></div>
		</div>		
		<script type="text/javascript">
		let box = document.querySelector("#box")		
		//得到所有名字为index的类
		let indexArr = document.querySelectorAll(".index")
		// 打印类名为index的数组对象
		 console.log(indexArr)
		//新生成一个类名为index的div,并把它插入DOM文档
		 let index1 = document.createElement("div")
		 index1.className="index"
		 box.appendChild(index1)		 
		//打印类名为index的数组对象
		 console.log(indexArr)
		</script>

它得到的结果为

       尽管我们重新插入了一个类名为index的元素节点,但是前后两次打印的结果是一致的,它需要手动更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值