VueBloghyhero6

更新几道面试题,关于闭包,数组函数对象,this指向

2020-03-24 / 2020-03-30 / 343次浏览
var haha = 1;

    (function () {
        var haha = 10
        var a = function () {
            console.log(haha)   // 这个隐蔽
        }
        a()
    })()
    console.log(haha)

先不说答案

var haha = 1;
    (function () {
        haha = 10
        var a = function () {
            console.log(haha)   // 这个隐蔽
        }
        a()
    })()
    console.log(haha)

这个呢

var haha = 1;
    (function () {
        haha = 10
        var a = function () {
            console.log(haha)   // 这个隐蔽
        }
    })()
    console.log(haha)

那这个呢。

一切与浏览器跑的为基准, 说它沙雕我不知道考这种东西的意义何在。

第一题
里面输出 10 外面输出 1 函数内部作用域 没啥好说的对吧。

第二题
内部函数 作用域改变了外部 所以输出都是 10

第三题
外部输出10,里面根本就没调用。我就说出这种题的人是闲的。

在看下面这道沙雕面试题

    var i
    var a = function () {
        var arr = []
        for(i = 0; i < 3; i++){
             arr.push(function () {
                console.log(i)
            })
        }
        return arr
    }

var b = a()

console.log(b[0])

console.log(b[2])

是啥

明确的 说
f() {
console.log(i)
}

console.log(b[0] ()) // 3
console.log(b[2] ()) // 3

函数 执行的时候,for 循环早执行完了 ,所以是3。

所以 哪怕得到了答案,依旧 不知道他要考啥。

//找出this 指向

这里说一句网上关于的this 的指向,谁调用指向谁的说法是错误的,或者说不全对。

const foo = {
    bar: 10,
    fn: function () {
        console.log( this )
        console.log( this.bar )
    }
}

var fn1 = foo.fn

fn1()

根据谁调用指向谁的话,不好意思,这里的this 指向window,虽然fn在 foo 对象中被引用,但是赋值 给 fn1 之后, fn1 的执行环境 仍然是在window 全局环境中。因此输出 window 和 undefined,它们相当与。

console.log(window)

console.log( window.ba)

如果将上面题目变换一下

const foo = {
      bar: 10,
      fn: function() {
          console.log(this)
          console.log(this.bar)
      }
}

foo.fn()

这次的this 指向就是对的 { bar:10 , fn:f } 10 将输出这俩。

因为 这个时候this 指向的是最后调用它的对象,

小结一下:执行函数时,如果函数中的this 是被上一级调用,那么this 就指向上一级对象,否则就指向全局。