我来自Java背景,基于类的继承模型,试图了解Javascript基于原型的继承模型。让我失望的部分原因是,我认为Java具有“这个”的意思 - 而Javascript的“这个”是一个非常不同的野兽。我知道Javascript的“this”总是指函数的调用者,而不是函数定义的范围 - 我的意思是,我已经阅读并理解它的含义。但我想更深入地了解这一点,我认为有另一个名字会有所帮助。你怎么看待JS“这个”?每次碰到它都会做出心理替代吗?如果是这样 - 你使用什么词或短语?
答案 0 :(得分:17)
this
合理地重命名为context
。
它实际上指的是当前作用域的执行上下文,虽然该上下文可以是一个类的实例,但它当然不一定是 - 它可以是任何对象,它可以在运行时修改。
证明无法保证Javascript中的“方法”在定义它的“类”的实例上运行:
function Cat(){
this.texture = 'fluffy';
this.greet = function(){
alert("Pet me, I'm " + this.texture);
}
}
var cat = new Cat();
// Default to using the cat instance as the this pointer
cat.greet(); // Alerts "Pet me, I'm fluffy"
// Manually set the value of the this pointer!
cat.greet.call({texture: 'scaly'}); // Alerts "Pet me, I'm scaly"
重要的是要注意 this
对象的值完全独立于包含函数的定义。
答案 1 :(得分:9)
一个可能的替代名称是owner
。这将引导您的思维方向,即所有者可以根据您正在执行的代码进行更改。
此示例来自quirksmode:
在JavaScript中this
总是指我们正在执行的函数的“所有者”,或者更确切地说,指向函数是其方法的对象。当我们在页面中定义忠实函数doSomething()时,它的所有者是页面,或者说是JavaScript的窗口对象(或全局对象)。但是,onclick属性由它所属的HTML元素拥有。
在以下代码中,
function doSomething() {
this.style.color = '#cc0000';
}
和
element.onclick = doSomething;
,owner
指向执行该方法时包含该方法的对象。
------------ window --------------------------------------
| / \ |
| | |
| this |
| ---------------- | |
| | HTML element | <-- this ----------------- |
| ---------------- | | doSomething() | |
| | | ----------------- |
| -------------------- |
| | onclick property | |
| -------------------- |
| |
----------------------------------------------------------
答案 2 :(得分:5)
我认为JavaScript的this
比你想象的更接近Java的this
。在OOP上下文中,this
表示“此实例”。我认为JavaScript的this
关键字可能令人困惑的是,可以具有不同的含义,具体取决于上下文。
答案 3 :(得分:3)
this
不是函数的调用者(尽管它可能是)或函数定义的范围(尽管它可能是) - 它是函数的 context 。
@Andrew Hare提到的转变意义可能更接近你混乱的根源;由于JS的原型继承机制,function
关键字可能意味着,取决于它的使用方式,比Java的class
更接近Java的方法定义。
假设在浏览器中执行:
var q = this.document; //this is window
var o = new (function pseudoconstructor(){
this.property = "something else" //the new keyword changed 'this' to mean 'the object I'm about to return'
})();
答案 4 :(得分:1)
'JavaScript this'怎么样?它会让你直接与你正在做的事情联系在一起,同时也提醒你,你正在使用的'this'概念就是JavaScript的概念。
最终,我希望你不要再把它称为'JavaScript this'而只是称之为'this',充分意识到你在工作的环境中意味着什么。我可能认为这可能是无论如何,你想去哪里。
答案 5 :(得分:0)
我使用一些易于类型的心智模型来吸收新颖的语法,例如:
$(document).ready(function() {
function baffle() {
alert(this.b);
}
function what() {
this.b = "Hello";
baffle();
}
function huh() {
this.b = "World";
baffle();
}
what();
huh();
}
);
这很糟糕地转化为草率的,想象中的C ++:
template <class This>
function baffle() {
alert(This.b);
}
function what() {
b = "Hello";
baffle<what>();
}
function huh() {
b = "World";
baffle<huh>();
}
what();
huh();
答案 6 :(得分:0)
我认为this
最适合历史原因。 JavaScript中的this
并不是一个通用的短语,因为它不仅可以自动分配给非常不同的引用,例如,在程序函数的上下文中this
或者this
在对象的上下文中,但脚本编写者也可以使用this
和Function.apply
分配Function.call
。
然而,this
的含义只能调整,因为JavaScript和DOM以一些非常奇怪的方式工作。例如,Function.apply
的主要用途是在事件调用中保留元素引用的上下文。您将在Prototye的Function.bind()
方法中看到这一点。
this
是正在执行函数的上下文的占位符,并且很难得到更具体的内容。但是,this
的大多数用法使其成为一个语义上合适的关键字。在bind()
的情况下,即使我们使用方法来随意更改函数中this
的含义,也应该使用它来使this
更合适。 。许多业余JavaScript程序员都被this
在事件处理程序中的奇怪行为所抛弃,Function.apply
用于纠正“错误”。
答案 7 :(得分:-1)
自我约束逻辑(自我或者这个)避免了悖论,有利于在自我(本)之外工作。应该自己(这个)将所有内容和所有内容保持为一,它可以保持静态,没有实例和类方法(静态)。为了避免悖论,避免自我引用和逻辑保持所有真理可证明,反之亦然,所有可证明都是真的。