Javascript';s";这是什么;?
我来自Java背景,有基于类的继承模型,试图了解Javascript基于原型的继承模型。让我感到不快的部分原因是,我牢牢记住了Java中“this”的含义,而Javascript的“this”是一个非常不同的野兽。我知道Javascript的“this”总是指函数的调用者,而不是定义函数的范围——我的意思是,我读过这篇文章,并且从表面上理解了它的含义。但我想更深入地了解这一点,我想换个名字会有所帮助。你如何看待JS“这个”?你是否每次遇到它时都会进行心理替代?如果是的话-你用什么词或短语?我认为JavaScript的Javascript';s";这是什么;?,javascript,syntax,this,Javascript,Syntax,This,我来自Java背景,有基于类的继承模型,试图了解Javascript基于原型的继承模型。让我感到不快的部分原因是,我牢牢记住了Java中“this”的含义,而Javascript的“this”是一个非常不同的野兽。我知道Javascript的“this”总是指函数的调用者,而不是定义函数的范围——我的意思是,我读过这篇文章,并且从表面上理解了它的含义。但我想更深入地了解这一点,我想换个名字会有所帮助。你如何看待JS“这个”?你是否每次遇到它时都会进行心理替代?如果是的话-你用什么词或短语?我认为
this
比你想象的更接近Java的this
。在OOP上下文中,“this表示“this instance”。我认为JavaScript的this
关键字可能令人困惑的是,它可能根据上下文具有不同的含义。关于“JavaScript this”如何?它会让你直接与你正在做的事情联系在一起,也会让你意识到你目前正在使用的“this”的概念就是JavaScript概念
最终,我希望您不再称它为“JavaScript this”,而只称它为“this”,因为您完全知道这在您工作的上下文中意味着什么。无论如何,我希望这可能是您想要到达的地方。
此
不是函数的调用方(尽管可能是)或函数的定义范围(尽管可能是)-它是函数的上下文
@Andrew Hare所指的意义转移可能更接近于你困惑的根源;由于JS的原型继承机制,函数
关键字可能意味着更接近Java的类,而不是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'
})();
这个
在Javascript中可以合理地重命名为上下文
它实际上是指当前作用域的执行上下文,虽然该上下文可以是类的实例,但它当然不一定是-它可以是任何对象,并且可以在运行时修改
证明无法保证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"
需要注意的是,此
对象的值完全独立于包含函数的定义位置一个可能的替代名称是所有者
。这将引导您的思维指向所有者可以根据您正在执行的代码进行更改的方向
此示例来自:
在JavaScript中,这个
总是指我们正在执行的函数的“所有者”,或者更确切地说,指函数作为方法的对象。当我们在页面中定义忠实的函数doSomething()时,它的所有者是页面,或者更确切地说是JavaScript的窗口对象(或全局对象)。不过,onclick属性属于它所属的HTML元素
在下面的代码中
function doSomething() {
this.style.color = '#cc0000';
}
及
,owner
指向执行该方法时包含该方法的对象
------------ window --------------------------------------
| / \ |
| | |
| this |
| ---------------- | |
| | HTML element | <-- this ----------------- |
| ---------------- | | doSomething() | |
| | | ----------------- |
| -------------------- |
| | onclick property | |
| -------------------- |
| |
----------------------------------------------------------
------窗口--------------------------------------
| / \ |
| | |
|这个|
| ---------------- | |
|| HTML元素|我吸收了新颖的语法,几乎没有易于键入的心智模型,例如:
$(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();
模板
功能挡板(){
警惕(本节b节);
}
函数什么(){
b=“你好”;
挡板();
}
函数huh(){
b=“世界”;
挡板();
}
什么();
嗯();
我认为出于历史原因,这是最合适的。JavaScript中的this
并没有一个一刀切的短语,因为它不仅可以自动分配给非常不同的引用,例如,在过程函数上下文中的this
,或者在对象上下文中的this
,但是脚本编写者也可以使用函数.apply
和函数.call
来分配
然而,这个
的含义是可以调整的,因为JavaScript和DOM以一些非常奇怪的方式工作。例如,函数.apply的主要用途是在事件调用中保留元素引用的上下文。您将在Prototye的函数.bind()中看到这一点
这个
是执行函数的上下文的占位符,很难得到比它更具体的内容。然而,this
的大多数用法使其成为语义上合适的关键字。对于bind()
,即使我们使用方法在函数中任意更改this
的含义,也应该使用它使this
比不使用它时更合适。许多业余JavaScript程序员对事件处理程序中的this
的奇怪行为感到厌烦,而函数。apply
用于纠正“错误”。自引用逻辑(self或this)避免了自相矛盾的情况,有利于处理非self(this)的工作。如果self(这)将一切都保持为一,那么它也可以保持静态,没有实例,而使用类方法(static)。为了避免自相矛盾,避免自相矛盾,逻辑使所有真理都是可证明的,反之亦然,所有可证明的都是真的。“this”并不总是指“this instance”。例如,您可以手动设置
template <class This>
function baffle() {
alert(This.b);
}
function what() {
b = "Hello";
baffle<what>();
}
function huh() {
b = "World";
baffle<huh>();
}
what();
huh();