/**
* js中变量声明未赋值 结果是undefined
* js中没有声明变量 结果报错
* js中的就近原则
* var定义的是函数作用域 有变量提升的作用
* 没有限定符修饰的,是绑定在window上的,是全局作用域 没有变量提升作用
*
* */
// 情景1
console.log(a) //undefined
var a = 'a'
// 以上等价下面方式 变量声明为赋值
var a;
console.log(a)
a = 'a'
// 情景2 作用域内的变量提升
function test() {
console.log(a)//undefined
var a = "abcd";
console.log(a) //abcd
};
test()
// 以上等价下面方式 变量声明为赋值
function test() {
var a;
console.log(a)
var a = "abcd";
console.log(a)
};
test()
//情景3 就近原则
var a = 'bcd'
function test() {
console.log(a)//undefined
var a = "eeeee";
console.log(a) //eeeee
};
test()
//情景4 直接定义a 此时a 是没有作用域的此时a 不存在变量的提升
// 第一个打印报错 a is not defined 后面一个打印不会执行
// js代码时按照顺序执行的,前面代码报错后,后面代码都不会执行
function test() {
console.log(a); //报错,a is not defined
a = "abcd";
console.log(a)
};
test();
// 情景4
function test() {
a = "eee";
console.log(a); //eee
};
test();
console.log(window.a); // eee
function test() {
var a = "abcd";
console.log(a);//abcd
};
test();
console.log(window.a); //undefined
/**
*js中方法的提升 方法>变量
* js中的方法是整体提升到顶部的
*
* */
// 情景1
console.log(a); // f a() {return 10;}
console.log(a()); // 10
var a = 3;
console.log(a) //3
function a() {
return 10;
}
// 以上等价于下面的情况
function a() {
return 10;
}
var a
console.log(a); // f a() {return 10;}
console.log(a()); // 10
a = 3;
console.log(a) //3
// 情景2
a(); //a is not a function
var a = function () {
console.log("abcd");
};
// 此时的a是定义了一个变量不是一个方法,执行a()就会报错
// 以上等价一下
var a;
a()
a = function(){
console.log("abcd");
}
// 情景3 //js中的方法整体提示到顶部
a()//abcd
function a(){
console.log("abcd");
}
// 变量i是var定义的属于全局变量,只有一个变量i,函数内的i指向的也是全局的变量i
for(var i=0;i<3;i++){
document.addEventListener('click',function(){
console.log(i)
})
}
// 结果 3 3 3
// let仅在块级作用域for循环内有效,不是全局的,三次循环产生三个数值
// 这样导致每次函数指向自己对应的值
for(let i=0;i<3;i++){
document.addEventListener('click',function(){
console.log(i)
})
}
// 结果 0 1 2
/**
* var 和 let的区别
*
* */
// 1 let不存在变量的提升
// 2 let存在暂时性死区
// 3 不允许重复声明