复制方法后的行为不同

时间:2013-04-12 08:26:22

标签: javascript

我期待getName2和getName3的行为相同,但getName3会抛出错误(在非严格模式下打印'The Window')

"use strict";

var name = 'The Window';
var object = {
    name : 'The Object',
    getName: function(){
        alert(this.name);
    }
};

object.getName();    // The Object

object.getName2 = object.getName;
object.getName2();    // The Object

(object.getName3 = object.getName)(); // Error: TypeError: this is undefined

此代码源自N.Zakas的Web开发人员专业Javascript第7章中的示例。

1 个答案:

答案 0 :(得分:2)

函数的上下文取决于如何调用。在最后一个示例中,您使用grouping operator(一对括号)返回对object.getName引用的函数的引用。它失去了object的背景。

然后当你调用该函数时,由于它丢失了object的上下文并且你在严格模式下运行,因此上下文成为全局对象,thisundefined。您可以强制该函数在object的上下文中运行,例如,将其显式绑定到它:

(object.getName3 = object.getName).bind(object)(); // The Object