在函数中使用Javascript“this”关键字

时间:2015-02-10 18:22:50

标签: javascript function reference this

我知道Javascript不是真正的OO语言,ECMAScript 6的引入应该可以缓解其中的一些问题,但在Javascript中使用this关键字真的让我感到困惑,至少在尝试时在Javascript中复制“私有”函数。

请考虑以下代码:

function Person() {

    this.name = "Blake";

    var sayHi = function() {
        console.log("Salutations. My name is " + this.name);

        this.name = "Jon";
        console.log("Salutations. My name is " + this.name);

        this.sayBye();
    };

    this.callSayHi = function() {
        console.log("O hai, my name is " + this.name);
        sayHi();
    };

    this.sayBye = function() {
        console.log("Goodbye " + this.name);
    };

};

var blake = new Person();
blake.callSayHi();

对于callSayHi()函数,上下文是调用callSayHi()blake的对象。因此,this的定义是名为Person的{​​{1}}的实例,控制台输出以下内容:

blake

接下来,调用O hai, my name is Blake 函数。此时,我会假设sayHi()会再次引用this,但控制台会说出其他意外行为:

blake

接下来,我尝试设置神秘的Salutations. My name is result 引用并再次登录到控制台:

this

但是,此时,我仍然不知道Salutations. My name is Jon 引用了什么,只是我已经在其上分配了一个属性,并且该属性的旧值为this。< / p>

最后,要检查result是否引用this,我会致电blake,这会给我一个错误:

sayBye()

所以我知道Uncaught TypeError: undefined is not a function this的背景下没有引用blake;那么sayHi()指的是什么?它是指this(范围较窄)还是指sayHi(范围更广)?

有没有办法让我声明一个上下文为window但没有明确分配给属性的函数(类似于像Java这样的语言中的“私有”函数)?

最后,一个更一般的问题:如果Person在我的第一个问题中引用this,那么window的定义如何不绑定到this.name,而是绑定到sayHi?我创建了一个名为window的函数,Person在该上下文中引用this,但当我创建函数Person时,sayHi引用this } ...?是因为window被定义为:

sayHi

......而不是:

var sayHi = function() { ... }

1 个答案:

答案 0 :(得分:0)

你可能想要的是:

function Person() {
  this.name = "Blake";

  return this;
};
Person.prototype.sayHi = function() {
  console.log("Salutations. My name is " + this.name);

  this.name = "Jon";
  console.log("Salutations. My name is " + this.name);

  this.sayBye();
};

Person.prototype.callSayHi = function() {
  console.log("O hai, my name is " + this.name);
  this.sayHi();
};

Person.prototype.sayBye = function() {
  console.log("Goodbye " + this.name);
};

var blake = new Person();
blake.callSayHi();

所以这里有一些解释:

每个函数都有自己的变量作用域,如果你在函数中定义一个函数,新函数只能在函数中使用,所以它们的上下文来自函数。如果在原型上定义函数,则函数的上下文就是这个。

希望有所帮助