前端 关于this指向延伸问题

img

console 第一个的时候 val乘等于2 一直感觉是4 怎么会是8呢 我不理解这个? 有人能给解答一下嘛?

这个问题很好,考验的是上下文。你看下面这张图,如果什么都不计算,只打印的话,也会发现打印的是2,不是obj中的4

img

原因在于下面这句代码,这里的func其实已经跟obj这个对象没有关系,这句话先相当于给window注册了一个func方法。
而面向对象语言中 this 表示当前对象的一个引用。但在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变。
所以这个时候执行环境变成了window,所以val变成了2

var func = obj.dbl
window.val = 2;
var obj = {
    val: 4,
    dbl: function () {
        this.val *= 2;
        val *= 2;
        // 看这里的输出
        console.log('this : ' + this);
        console.log('val : ' + val);
        console.log('this.val : ' + this.val);
    }
}
var func = obj.dbl;
func();

如果要达到你想要的效果,需要修改一下代码

window.val = 2;
var obj = {
    val: 4,
    dbl: function () {
        this.val *= 2;
        val *= 2;
        // 看这里的输出
        console.log('this : ' + this);
        console.log('val : ' + val);
        console.log('this.val : ' + this.val);
    }
}
var func = obj.dbl;
func.call(obj);