一丶声明变量
1.var
var+变量名
(1)函数体外声明的变量--全局变量
var x=5
function f1() {
alert(x) 、、5
}
f1()
alert(x) //5
(2)函数体内定义的变量--局内变量
function f1() {
var y=6
alert(y) //6
}
f1()
alert(y) //报错
(3)没有var,直接声明变量--隐式声明全局
x=5
function f1() {
alert(x) //5
y=6 //隐式声明全局变量被
}
f1()
alert(x) //5
alert(y) //6
(4)window对象声明全局
function f1() {
var y=6
window.x=5
}
f1()
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.变量提升
将变量提升到函数的top位置 且只能提升变量的声明 不会提升赋值
如函数内部访问全局 采用window.x或alert(window["x"])
(1)x=1
function f1(){
//预编译
alert(x) //undefined
var x=2
alert(x) //2
alert(window.x) //添加window只访问全局
}
f1()
(2)
x=1;
(function (g) {
alert(x) //undefined
alert(window.x)
alert(g.x) //1
var x=2
}) (window)
(3)
for(var i=0;i<3;i++){
console.log(i,m)
for(var m=0;m<3;m++){
var k=m+1
}
console.log(k)
}
???(4)异步情况下变量传递
for(var i=0;i<3;i++){
setTimeout(function(){
console.log(i);
},100)
} console.log(3);
异步调用,循环已结束
解决:立即执行函数
for(var i=0;i<3;i++){
setTimeout((function(m){
return function(){console.log(m)}
})(i),100)
}
//0 1 2
二丶作用域
1.ES5--函数作用域
function f1() {
var y=6
alert(y) //6
}
f1()
alert(y) //报错
2.ES5--全局作用域
预编译
for(var i=0;i<3;i++){
console.log(i,m,k) //0 undefined undefined
for(var m=0;m<3;m++){
var k=m+1
}
console.log(k) //3 1 3 3 3 2 3 3 3
}
变形:
for(var i=0;i<3;i++){
console.log(i,m,k) //报错
for(var m=0;m<3;m++){
k=m+1
}
console.log(k)
}
3.ES6--新增 块级作用域
{}、if和for中的{}都属于作用域
(1){
var a=1
console.log(a) //1
let b=2
console.log(b) //2
}
(2)if(true){
var a=2
let b=3
}
console.log(a) //2
console.log(b) //报错
(3)for(var i=0;i<4;i++){
var d=10
}
console.log(i) //4
console.log(d) //10
(3)for(let i=0;i<4;i++){
let d=10
}
console.log(i) //报错
console.log(d) //报错
function f1(){
let b=2
var a=1
}
console.log(a); //报错
console.log(b); //报错
三丶setTimeout与setInterval
setTimeout:定时器 指定时间后执行
var timmer=setTimeout(csh, 3000);
function csh() {
console.log('javascript')
}
clearTimeout(timmer) //清除定时器
setInterval:间歇调用,每个指定时间调用内容
var timmer=setInterval(csh, 3000);
function csh() {
console.log('javascript')
}
clearInterval(timmer)
四丶var let const区别
ES6新增--let const
var 对函数作用域有效,对块级作用域无效
let 对函数作用域和有块级作用域效
var 对函数作用域有效,对块级作用域无效
允许一个变量声明多次
let 对函数作用域有效,对块级作用域无效
不允许出现几条声明(不允许一个变量声明多次)
var 可以进行变量提升
let 没有变量提升(暂时性死区)
var 声明的变量会成为window对象属性 window.a
let 声明的变量不会成为window对象属性
for循环中的迭代变量(var i),var声明会渗透到循环体外
for循环中的迭代变量(let i),let声明不会渗透到循环体外
const 定义常量
不允许修改
--特殊:const定义的引用类型仅保证指针类型不发生改变,内容允许被修改
块级作用域,函数作用域都能有效
不允许重复定义变量
{
const a=5
// a=6 //报错
}
console.log(a); //报错
var a
var a
let b
let b //报错