一、声明变量
1、var
var + 变量名
(1)函数体外声明的变量————全局变量
var x = 5
function f1(){
alert(x) //5
}
f1()
alert(x) //5
(2)函数体内定义的变量————局部变量
function f1() {
var y = 6
console.log((y)); //6
}
f1()
console.log(y); //报错
(3)如果没有var 直接声明变量,会进行—隐式声明全局
x = 5
function f1() {
console.log(x); //5
y = 6
}
f1()
console.log(x); //5
console.log(y); //6
(4)window对象声明全局变量
function f1() {
var x = 6
window.x = 5
}
f1()
console.log(x); //5
(5)显示与隐式全局变量区别
var v1 = "a"
v2 = "b"
window.v4 = "d";
(function() {
v3 = "c"
})()
console.log(v1);
console.log(delete v1); //false: var 定义的全局变量不能被删除。
console.log(v2);
console.log(delete v2); //true 没经过var定义的全局变量,无论函数体内或体外都可被删除。
console.log(v3);
console.log(delete v3); //true
console.log(v4);
console.log(delete v4); //true
2、变量提升
将变量提升到函数的top位置,且只能提升变量的声明,不会提升赋值。
如函数内部要访问全局,采用window.x或window["x"]
(1)
x = 1
function f1() {
console.log(x); //undefined
console.log(window.x); //1
console.log(window["x"]); //1
var x = 2;
console.log(x); //2
}
f1()
(2)
x = 1;
(function() {
console.log(x); //1
})(window)
(3) 变量提升————全局作用域
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 //3
}
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);
}
二、作用域
1、ES5————函数作用域
function f1() {
var y = 6
console.log((y)); //6
}
f1()
console.log(y); //报错
function fi(){
let b=2
vara=1
}
console.log(a) //报错
console.log(b) //报错
2、全局作用域
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 //3
}
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);
}
3.ES6 --新增 块级作用域
{} if 和 for中的{}都属于块级作用域
(1)
{
var a=1
console.log(a) //1
let b=2
console.log(b)
}
(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
for(let i=0;i<4;i++){
let d=10
}
console.log(i) //报错
console.log(d) //报错
三、setTimeout与setInterval 的区别
setTimeout:定时器 指定时间后执行
setTimeout(csh,3000);
function csh(){
console.log('javascript')
}
clearTimeout(timmer) //清除定时器
seInterval:间歇调用,每个指定时间调用内容
seInterval(csh,3000);
function csh(){
console.log('javascript')
}
clearTimeout(timmer)
(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(){
return function(){console.log()}
})(i),100)
}
四、var let const区别
ES6 新增--let const
var 对函数作用域有效,对块级作用域无效
允许一个变量声明多次
var可以进行变量提升(暂时性死区)
var声明的变量会成为window对象的属性 window.a
for循环中的迭代变量(var i),var声明会渗透到循环体外
let 对函数作用域和块级作用域都有效
不允许出现陈余变量(不允许一个变量声明多次)
let没有变量提升(暂时性死区)
let声明的变量不会成为window对象的属性
for循环中的迭代变量(let i),let声明会渗透到循环体外
const 定义常量
常量不允许修改
--特殊:const定义的引用类型仅保证指针不发生改变内容允许被修改
只能在块级作用域、函数作用域都有效
不允许重复定义变量
var a
var a
let b
let b //报错
var a=5
let b=6
console.log(a)
var a=5
alert(window.a) //5
let b=6
alert(window.b) //undefined
for(var i=0;i<5;i++){
}
console.log(i) //5
for(leti=0;i<5;i++){
}
console.log(i) //报错
{
const a=5
a=6 //报错
}
console.log(a) //报错
function f1(){
const a=5
}
console.log(a) //报错
const a=5
const a=6
const p1{"name":"zs","age":23}
p1.name="ls"
console.log(p1.name) //ls
p1{} //报错,改变地址