Javascript 在重写函数中获取此上下文的正确值
我有以下问题: 我试图覆盖一个函数,然后用angular(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
$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
。并且ifbar
函数也期望参数也可以通过调用方法传递到thisArg
。有关呼叫的信息,请参见
所以你的问题的解决办法是
var switchToFunction = AnnoModule.Anno.prototype.switchTo;
AnnoModule.Anno.prototype.switchTo = function(otherAnno) {
switchToFunction.call(this, otherAnno);
$scope.$apply();
};
希望这能让您清楚地了解问题。这很有效,谢谢。没想到会这么容易。。。我甚至已经尝试在与您相同的位置上使用call
方法,但我没有将this
作为第一个参数。很高兴提供帮助:)。是的,call
或apply
的唯一目的是在调用函数时设置this
的值,而不是其他