代码之家  ›  专栏  ›  技术社区  ›  Carl Manaster

对于javascript的“this”有什么更好的名字?

  •  10
  • Carl Manaster  · 技术社区  · 16 年前

    我来自Java后台,基于其基于类的继承模型,试图让我了解JavaScript的基于原型的继承模型。我认为JavaScript的“这个”是一个非常不同的野兽。我理解javascript的“this”总是指函数的调用者,而不是定义函数的范围——我的意思是,我已经阅读了它,并且从表面上理解了它的含义。但我想更深入地了解这一点,我想用另一个名字来称呼它会有所帮助。你觉得JS“这个”怎么样?你每次遇到它都会做精神上的替代品吗?如果是-你用什么词或短语?

    8 回复  |  直到 16 年前
        1
  •  17
  •   Kenan Banks    16 年前

    this 可以合理地重新命名为 context 在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"
    

    重要的是要注意 的值 对象完全独立于定义包含函数的位置 .

        2
  •  9
  •   Brian Ramsay    16 年前

    一个可能的替代名称是 owner .这将引导您注意到所有者可以根据您正在执行的代码进行更改。

    此示例来自 quirksmode :

    在JavaScript中 this 总是指我们正在执行的函数的所有者,或者更确切地说,指函数是其方法的对象。当我们在页面中定义忠实的函数dosomething()时,它的所有者是页面,或者更确切地说,是JavaScript的窗口对象(或全局对象)。不过,onclick属性属于它所属的HTML元素。

    在下面的代码中,

    function doSomething() {
       this.style.color = '#cc0000';
    }
    

    element.onclick = doSomething;
    

    , 主人 指向执行该方法时包含该方法的对象。

    ------------ window --------------------------------------
    |                                          / \           |
    |                                           |            |
    |                                          this          |
    |   ----------------                        |            |
    |   | HTML element | <-- this         -----------------  |
    |   ----------------      |           | doSomething() |  |
    |               |         |           -----------------  |
    |          --------------------                          |
    |          | onclick property |                          |
    |          --------------------                          |
    |                                                        |
    ----------------------------------------------------------
    
        3
  •  5
  •   Andrew Hare    16 年前

    我认为javascript的 this 更接近Java 比你想象的还要多。在OOP上下文中, 表示“本实例”。我认为JavaScript的 关键词是它 可以 根据上下文有不同的含义。

        4
  •  3
  •   Dan Davies Brackett    16 年前

    this 不是函数的调用方(尽管它可能是)或定义函数的作用域(尽管它可能是),而是函数的 语境 .

    @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'
    })();
    
        5
  •  1
  •   Ross Henderson    16 年前

    “javascript this”怎么样?它会让你直接与你正在做的事情联系在一起,同时也会提醒你,你目前正在使用的“这个”的概念是JavaScript概念。

    最后,我希望你不再称它为“javascript this”,而仅仅称它为“this”,完全了解在你工作的环境中这意味着什么。不管怎样,我希望你能到你想去的地方。

        6
  •  0
  •   Thomas L Holaday    16 年前

    我吸收了新的语法,几乎不容易输入心理模型,例如:

    $(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();
    
        7
  •  0
  •   Andrew Noyes    16 年前

    我想 this 因为历史原因最合适。没有一个真正适合所有人的短语 在javascript中,因为它不仅可以自动分配给非常不同的引用,例如, 在程序功能的上下文中,或 在对象的上下文中,但是 也可以由脚本编写者使用 Function.apply Function.call .

    然而,其意义在于 是可调整的,因为javascript和dom以一些非常奇怪的方式工作。例如,主要使用 函数应用 在事件调用中保留元素引用的上下文。你会在原型中看到这个 Function.bind() 方法。

    是一个用于执行函数的上下文的占位符,很难得到比这更具体的内容。然而,大多数使用 使其成为语义上适当的关键字。在情况下 bind() 即使我们使用方法来任意改变 在函数中,它应该用于 比没有它更合适。许多业余的javascript程序员被 事件处理程序,以及 函数应用 是用来纠正“错误”的。

        8
  •  -1
  •   Niklas Rosencrantz    16 年前

    自我参照逻辑(self或this)避免了自相矛盾的优势,而不是在自我(this)上工作。应该将所有的东西和所有的东西都保持在一个整体上,它也可以在没有实例的情况下保持静态,而代之以类方法(静态)。为了避免自相矛盾,避免自我参照和逻辑使所有的真理都是可证明的,维切尔萨,所有可证明的都是真实的。