JavaScript:在调用之前将函数重新分配给局部变量,而不是直接调用,并对';这';

JavaScript:在调用之前将函数重新分配给局部变量,而不是直接调用,并对';这';,javascript,Javascript,考虑这个例子: function Dummy(buddy) { this._buddy = buddy; } Dummy.prototype.greetBuddy = function() { console.log('Hello, '+this._buddy); } function outerGreet1(dummy) { var func = dummy.greetBuddy; func(); } function outerGreet2(dummy) {

考虑这个例子:

function Dummy(buddy) {
    this._buddy = buddy;
}
Dummy.prototype.greetBuddy = function() {
    console.log('Hello, '+this._buddy);
}

function outerGreet1(dummy) {
    var func = dummy.greetBuddy;
    func();
}
function outerGreet2(dummy) {
    dummy.greetBuddy();
}
我只想说,这并不能说明我为什么要这样做,但这是我所遇到的情况的一个基本升华。我刚刚修复了程序中的一个错误,它是由这种区别引起的。outerGreet1将抛出错误,因为它找不到该错误。\u buddy,而outerGreet2将打印预期结果

为了代码清晰,我只是将函数复制到局部变量,但显然这对我来说是一个成熟的学习经验。这到底是怎么回事?我猜“this”最终指的是outerGreet1函数?我来自Java,所以我知道JavaScript只有函数作用域,但是为什么创建一个新的函数引用会改变它的行为呢?我的印象是“这”对应于当前的范围,我不确定重新分配是如何改变范围的,所以我的理解在某个地方有缺陷


如果这是一个常见的JavaScript问题,我深表歉意,但我很难用一种能找到答案的方式来表达我的搜索。

此变量取决于函数的使用方式

如果实例化函数(将其视为类),则
将引用该类的实例:

new outerGreet1(dummy); // `this` is an instance of outerGreet1
如果使用
Function.prototype.call调用它,那么
这个
将引用传递给
call
方法的任何对象:

outerGreet1.call(anotherObjec, dummy); // `this` refers to anotherObject
如果您只是直接执行它,那么
这个
可能指的是窗口或任何其他周围的范围

outerGreet1(dummy); // `this` likely refers to the window object
您还可以使用
Function.prototype.bind
将函数包装在特定范围内,以帮助清理:

var wrappedExample = outerGreet1.bind(aSpecificObject);
wrappedExample(dummy); // Doesn't matter how it's called, `this` will refer to aSpecificObject
当然,在使用<代码> BIN < /代码>之前(或者使用一个PultFube),你可能需要考虑你的目标浏览器。