一、声明变量
1.var
var + 变量名
(1)函数体外声明的变量--全局变量
(2)函数体内定义的变量--局部变量
(3)没有var,直接声明变量,会进行隐式声明全局。
(4)window对象声明全局
function f1(){
window.x=5
}
alert(x)//5
(5)显示与隐式全局变量区别
var v1="a"
v2="b"
window.v4="d";
(function(){
v3="c"
})()
console.log(delete v1);//false var定义的全局变量不能被删除
console.log(delete v2);//true 没经过var定义的全局变量,无论函数体内或体外都可被删除
console.log(delete v3);//true
console.log(delete v4);//true
**2.变量提升
(1) 将变量提升到函数的top位置,只能提升变量的声明,不能提升变量的赋值
如果函数内部要访问全局,采用window.x或window['x']
x=1
function f1(){
//预编译
//var x;
alert(x) //undefined
var x=2
alert(x)//2
alert(window.x)//1
}
f1()
(2)x=1;
(function(g){
alert(x)//undefined
alert(g.x)//1
var x=2
}(window))
(3)变量提升--全局作用域
预编译--变量提升
for(var i=0;i<3;i++){
console.log(i,m,k);
for(var m=0;m<3;m++){
var k=m+1
}
console.log(k);
}
for(var i=0;i<3;i++){
console.log(i,m,k);//报错
for(var m=0;m<3;m++){
k=m+1 //k为隐式全局变量,没有变量提升
}
console.log(k);
}
(4)异步情况下变量传递
for(var i=0;i<3;i++){
setTimeout(function(){
console.log(i)
},100)
} // 3 3 3异步调用,循环已结束
解决:立即执行函数
for(var i=0;i<3;i++){
setTimeout((function(m){
return function(){console.log(m)}
})(i),100)
}//0 1 2
二、作用域
1.ES5--函数作用域
2.ES5--全局作用域
3.ES6--新增 块级作用域
{} if和for中的{}都属于块级作用域
(1)
{
var a=1
console.log(a)
}
(2)
// if(true){
// var a=2
// }
// console.log(a);//2
(3)
for(var i=0;i<4;i++){
var d=10
}
console.log(i);//4
console.log(d);//10
三、setTimeout与setInterval
setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式
setTimeout(function(){
alert("Hello");
}, 3000);
setInterval() :间歇调用,每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除。
setInterval(function(){
alert("Hello");
}, 3000);
只不过setTimeout执行一次,而setInterval可以执行多次,
两个函数的参数也相同,第一个参数是要执行的code或句柄,第二个是延迟的毫秒数。
四、var let const区别
var 对函数作用域有效,对块级作用域无效
允许一个变量声明多次
var可以变量提升
声明的变量会成为window对象的属性 window.a
for循环中的迭代变量(var i),var声明会渗透到循环体外
let 对函数作用域和块级作用域都有效
不允许出现冗余声明(不允许一个变量声明多次)
没有变量提升(暂时性死区)
声明的变量不会成为window对象的属性
for循环中的迭代变量(let i),let声明不会渗透到循环体外
const 定义常量
不允许修改
---特殊:const定义的引用类型仅保证指针不发生改变,内容允许被修改
在块级作用域、函数作用域都有效
不允许重复定义变量