面试题主要解决var这个小妖精

235 阅读2分钟

作用域,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);