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

在函数中使用Javascript“this”关键字,javascript,function,reference,this,Javascript,Function,Reference,This,我知道Javascript不是一种真正的OO语言,ECMAScript 6的引入应该可以缓解其中的一些问题,但在Javascript中使用这个关键字确实让我感到困惑,至少在尝试在Javascript中复制私有函数时是如此 考虑以下代码: function Person() { this.name = "Blake"; var sayHi = function() { console.log("Salutations. My name is " + this.n

我知道Javascript不是一种真正的OO语言,ECMAScript 6的引入应该可以缓解其中的一些问题,但在Javascript中使用这个关键字确实让我感到困惑,至少在尝试在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的对象。因此,它的定义是名为blake的人的实例,控制台输出以下内容:

O hai, my name is Blake
接下来,调用sayHi函数。在这一点上,我假设这会再次提到blake,但控制台会以一些意外的行为表示:

Salutations. My name is result
接下来,我尝试再次将此引用和日志设置到控制台:

Salutations. My name is Jon
然而,在这一点上,我仍然不知道它指的是什么,只是我在它上面分配了一个属性,并且该属性有一个旧的result值

最后,为了检查这是否与blake有关,我打电话给Saybay,这给了我一个错误:

Uncaught TypeError: undefined is not a function
所以我知道这并不是指sayHi的背景下的blake;那么,这是指什么呢?它指的是更窄的范围还是更宽的范围

对于我来说,有什么方法可以声明一个函数的上下文是没有被显式分配到类似于Java等语言中的私有函数的属性的人

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

var sayHi = function() { ... }
…而不是:

function sayHi() { ... }

您可能想要的是:

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();
下面是一些解释:

每个函数都有自己的变量范围,这是指如果在函数中定义函数,则新函数仅在函数中可用,因此它们的上下文来自函数。如果在原型上定义函数,则函数的上下文如下所示


希望这有帮助

下面的答案可能会有帮助:JavaScript是一种OO编程语言。它只是没有像你说的那样实现类模式。但是您有可能实现类结构。此外,每个变量在JavaScript中都是一个对象。