变量修饰符
let/var
事实上,var的设计可以看成是JavaScript语言设计上的缺陷,所以提出了新的关键字let,
var的作用域主要在函数中,针对于块级是没有作用域的,比如if/for等,所以在开发中会引起一些问题的
btn: function {
var btns = document.getElementsByTagName('button')
for(var i = 0;i<btns.length;i++){
btns[i].onclick=function {
alert('点击了 '+i+'个按钮') //此时输出的都是最后一个按钮的i值,
}
}
}
解决办法
方法一:使用立即函数,因为函数对于var有作用域 (在ES5 中没有let块级变量时,必须借助function的作用域来解决使用外面变量的问题)
btn: function {
var btns = document.getElementsByTagName('button')
for(var i = 0;i<btns.length;i++){
(function(i){
btns[i].onclick=function {
alert('点击了 '+i+'个按钮')
}
})(i)
}
}
方法二:使用ES6中的块级作用域的变量修饰
btn: function {
var btns = document.getElementsByTagName('button')
for(let i = 0;i<btns.length;i++){
btns[i].onclick=function {
alert('点击了 '+i+'个按钮') //此时输出的都是最后一个按钮的i值,
}
}
}
const
注意一: 不可以修改变量值
const a = 10
a = 20 //错误
注意二: 声明变量的时候必须赋初始值
const a; //错误
注意三: 常量的含义是不能改变 指向对象不能修改,但是可以改变对象内部的属性
const obj={
name:'why',
age:12
}
obj.name='han' //正确 ,可以改变对象的属性
const obj={ //错误 不可以改变指向的对象
age:12,
sex:f
}
建议:在ES6 开发中 优先使用const,只有需要改变某一个标识符的时候才使用let