在函数中使用Javascript“this”关键字
我知道Javascript不是一种真正的OO语言,ECMAScript 6的引入应该可以缓解其中的一些问题,但在Javascript中使用这个关键字确实让我感到困惑,至少在尝试在Javascript中复制私有函数时是如此 考虑以下代码:在函数中使用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
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中都是一个对象。