什么是Javascript的“这个”更好的名字?

时间:2009-06-16 17:38:49

标签: javascript syntax this

我来自Java背景,基于类的继承模型,试图了解Javascript基于原型的继承模型。让我失望的部分原因是,我认为Java具有“这个”的意思 - 而Javascript的“这个”是一个非常不同的野兽。我知道Javascript的“this”总是指函数的调用者,而不是函数定义的范围 - 我的意思是,我已经阅读并理解它的含义。但我想更深入地了解这一点,我认为有另一个名字会有所帮助。你怎么看待JS“这个”?每次碰到它都会做出心理替代吗?如果是这样 - 你使用什么词或短语?

8 个答案:

答案 0 :(得分:17)

可以在Javascript中将{p> 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在对象的上下文中,但脚本编写者也可以使用thisFunction.apply分配Function.call

然而,this的含义只能调整,因为JavaScript和DOM以一些非常奇怪的方式工作。例如,Function.apply的主要用途是在事件调用中保留元素引用的上下文。您将在Prototye的Function.bind()方法中看到这一点。

this是正在执行函数的上下文的占位符,并且很难得到更具体的内容。但是,this的大多数用法使其成为一个语义上合适的关键字。在bind()的情况下,即使我们使用方法来随意更改函数中this的含义,也应该使用它来使this更合适。 。许多业余JavaScript程序员都被this在事件处理程序中的奇怪行为所抛弃,Function.apply用于纠正“错误”。

答案 7 :(得分:-1)

自我约束逻辑(自我或者这个)避免了悖论,有利于在自我(本)之外工作。应该自己(这个)将所有内容和所有内容保持为一,它可以保持静态,没有实例和类方法(静态)。为了避免悖论,避免自我引用和逻辑保持所有真理可证明,反之亦然,所有可证明都是真的。