Javascript - 为什么调用方法不能正常工作?

ana*_*til 1 javascript call

请参考 - https://jsfiddle.net/ta2u2z9a/

var o = {
    x: 6
};

function a() {
    this.x = 3;
    this.y = function() {
        alert(this.x)
    }
}

var a1 = new a();
a1.y.call(); //shouldn't it alert 3?

a1.y.call(o) //is alerting 6, correct!
Run Code Online (Sandbox Code Playgroud)

为什么是第一个警报,警告未定义?不应警惕3?

clo*_*eet 10

第一个参数.call()需要是方法的"所有者对象":

a1.y.call(a1);
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?

当您"自然地"(例如a1.y())调用方法时,值this会自动设置为对象(例如a1).

当使用函数作为方法(例如var x = a1.y; x();)时,值this可以是全局/窗口对象,或者null(取决于您是否处于"严格模式").

.call()方法(它是函数的一种方法)是一种显式设置this值的方法,而不是自动分配它.使用时.call(),您必须自己提供this值,作为第一个参数.