1.var 和 let
-
块级作用域
变量作用域:变量在什么范围内是可用的
{
var name = 'hello'
console.log(name)
}
console.log(name) //都可以打印出来
- 没有块级作用域引起的问题:if的块级
var func;
if (true){
var name ='why';
func=function () {
console.log(name)
};
// func()
}
name='haha~'
func(); //打印出 ‘haha’ 但我们一般不希望在方法外更改
- 没有块级作用域引起的问题:for的块级
问题:
var btns=document.getElementsByTagName('button');
for(var i = 0 ;i<btn.length;i++){
btns[i].addEventListener('click',function () {
console.log('第' + i + '个按钮');
//打印出来的都是3 btns的想用的原来i被外面for循环改变了
})
}
以前的解决方法:搞一个闭包 或者传至进方法 因为es5之前没有块级作用域的概念 所以只能借助于function的作用域来解决外界变量的问题
//为啥闭包可以解决这个问题 函数是有作用域的 所以函数里的i是不会被别人改掉的
var btns=document.getElementsByTagName('button');
for(var i = 0 ;i<btn.length;i++){
(function (num) {
btns[i].addEventListener('click',function () {
console.log('第' +num + '个按钮'); //打印出来的都是3 btns的想用的原来i被外面for循环改变了
})
})(i)//这个值是当时传进去的值,是有函数自己的作用域的,传啥是啥不会被外面的循环改变 立即执行函数
}
- es6 加入let let是有作用域的
let 是用来定义变量的
const btns=document.getElementsByTagName('button');
for(let i = 0 ;i<btn.length;i++){
btns[i].addEventListener('click',function () {
console.log('第' + i + '个按钮');
})
}
相当于执行3次 如下
// { 在里面定义i= 0
// btns[i].addEventListener('click',function () {
// console.log('第' + i + '个按钮');
// })
//
// }
// { 在里面定义i= 1
// btns[i].addEventListener('click',function () {
// console.log('第' + i + '个按钮');
// })
//
// { 在里面定义i= 2
// btns[i].addEventListener('click',function () {
// console.log('第' + i + '个按钮');
// })
//
// }
2.const
- 声明之后,不能修改,是用来遍历常量
- 在开发之中有限使用const 需要改变某一个标识(zhi)符的时候再用let
- 在使用const定义标识符的时候必须进行赋值
- 常量的含义是 指向的对象不能修改,但是可以改变对象内部属性
const obj={
name:'hello',
age:12
}
obj={}//不可以 会报错
obj.name='Vue'//允许的内部属性可以改