作用域,this,变量提升
1: this: 函数无调用者,this指向window
var a = 10;
function test() {
a = 100;
console.log(a);//100
console.log(this.a); //10函数无调用者,this指向window
var a;
console.log(a);//100
}
test();
// 函数无调用者,this指向window
2: 考察点:自执行,作用域,预解析
(function () {
var a = b = 3;//b=3;var a=b b是未在函数内部声明的
//非严格模式:b可不定义而使用,js解析器会帮你定义;严格模式:不行!!!
})()
console.log(b); //3
console.log(a);//报错,函数外部访问不到,只能在内部
3-1: js事件循环,等待队列,异步,单线程
var没得本事管理好自己的身子,所以只留下最新的那个,喜新厌旧,呸
for (var i = 1; i <= 3; i++){
setTimeout(function (){
console.log(i);//4.4.4
},0)
}
console.log(i);//4.
//主线程for执行,遇到异步任务--把异步一脚踢开,继续自己for循环--循环结束i=4。突然想起异步任务,赶忙拿回,但此时i=4了,而且异步又带回了两个主线程留下的恶果两个i=4.
3-2: 作用域。js事件循环,等待队列,异步,单线程
for (let i = 1; i <= 3; i++){
setTimeout(function (){
console.log(i);/1.2.3
},0)
}
//这个故事告诉我们var真垃圾。let是真爱
es5中只有两种作用域:全局和函数
es6中新增:块级作用域(let)
4-1: 作用域,变量提升,预解析参数
function fun(n) {
// 预解析,var n=underfind;n=n
console.log(n);//123
var n = 456;//修改n的值
console.log(n);//456
}
var n = 123;
fun(n);
4-2: 作用域,变量提升,预解析参数
function fun() {
// 预解析,var n=underfind;n=n
console.log(n);//underfind
var n = 456;//修改n的值
console.log(n);//456
}
var n = 123;
fun(n);
4-3: 作用域,变量提升,预解析参数
function fun() {
//去外面寻找n
console.log(n);//123
n = 456;//修改全局n的值
console.log(n);//456
}
var n = 123;
fun(n);