Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在重写函数中获取此上下文的正确值_Javascript_Angularjs_This - Fatal编程技术网

Javascript 在重写函数中获取此上下文的正确值

Javascript 在重写函数中获取此上下文的正确值,javascript,angularjs,this,Javascript,Angularjs,This,我有以下问题: 我试图覆盖一个函数,然后用angular($scope.$apply())应用它,但是我的这个-上下文似乎不正确 原始函数(在另一个文件中)如下所示: Anno.prototype.switchTo = function(otherAnno) { if (otherAnno != null) { this.hideAnno(); return otherAnno.show(); } else { console.wa

我有以下问题:

我试图覆盖一个函数,然后用angular(
$scope.$apply()
)应用它,但是我的
这个
-上下文似乎不正确

原始函数(在另一个文件中)如下所示:

Anno.prototype.switchTo = function(otherAnno) {
    if (otherAnno != null) {
        this.hideAnno();
        return otherAnno.show();
    } else {
        console.warn("Can't switchTo a null object. Hiding instead.");
        return this.hide();
    }
};
然后在另一个文件中,我“覆盖”它,如下所示:

var switchToFunction = AnnoModule.Anno.prototype.switchTo;
AnnoModule.Anno.prototype.switchTo = function(otherAnno) {
    switchToFunction(otherAnno);
    $scope.$apply();
};
实际上我保存了原始函数,然后重新定义原始函数来调用原始函数,然后应用范围

现在问题来了:正如您所看到的,函数中使用了
this.hideano()
,但在我重新定义的函数中,上下文是另一个,这就是为什么chrome抛出一个错误,说“this.hideano()不是函数”。但现在我不确定如何才能获得正确的上下文。我试着去理解,但我发现JavaScript太混乱了,我真的不明白


有人能帮我理解JavaScript的混乱吗?

当函数在js中作为方法调用时,其中的
this
指的是该方法所属的对象

另一方面,当函数自己被调用时,它内部的
引用全局对象或
未定义的

您正在将一个定义为方法的函数提取(然后调用)到一个独立的函数中,这就是为什么
这个
没有达到您期望的效果

在这种情况下,您需要的是打开或打开您的
switchToFunction
,将
this
的值设置为您需要的值。换句话说,您将旧方法的
this
设置为您创建的新方法的
this

var switchToFunction = AnnoModule.Anno.prototype.switchTo;
AnnoModule.Anno.prototype.switchTo = function(otherAnno, that) {
    switchToFunction.call(this, otherAnno); // sets `this` of the old method to be this of the new method you created
    $scope.$apply();
};

为了理解这个问题,我认为首先我们应该了解
这个
关键字是如何工作的,以及如何调整它

在JavaScript中,任何函数中的
这个
对象都是调用方法的对象

以下面的例子为例

var obj1 = {
    foo: function() {
        console.log(this);
    }
};

function bar() {
    console.log(this);
}
现在,当调用这些方法时,我们得到如下输出:

obj1.foo();     // obj1
bar();          // window
因为
foo
方法是在
obj1
上调用的,所以
方法内部的
foo
方法变成了
obj1
。类似地,
这个
内部
方法将是
窗口
对象

现在,如果我想在函数中用
obj1
作为
this
调用
bar
方法,该怎么办。为此,JavaScript提供了调用、应用和绑定方法来动态更改函数的
this
。让我们看看如何使用
call
方法实现这一点

bar.call(obj1);         // obj1
同样地

obj1.foo.call(window);          // window
call
方法将
thisArg
对象作为参数,它将是
bar
函数中的
this
。并且if
bar
函数也期望参数也可以通过
调用
方法传递到
thisArg
。有关
呼叫的信息,请参见

所以你的问题的解决办法是

var switchToFunction = AnnoModule.Anno.prototype.switchTo;
AnnoModule.Anno.prototype.switchTo = function(otherAnno) {
    switchToFunction.call(this, otherAnno);
    $scope.$apply();
};

希望这能让您清楚地了解问题。

这很有效,谢谢。没想到会这么容易。。。我甚至已经尝试在与您相同的位置上使用
call
方法,但我没有将
this
作为第一个参数。很高兴提供帮助:)。是的,
call
apply
的唯一目的是在调用函数时设置
this
的值,而不是其他