了解原型和这个

这个问题在这里已经有了答案:

  • JavaScript .prototype如何工作? 21个答案

  • 在JavaScript中,所有关于你是实例化还是仅仅调用一个函数。 只有在前者的情况下,它才是构造者。 正如您可能已经知道的,不同之处在于是否在函数引用之前使用了new关键字。

    这是控制你的构造函数中的属性是属性的东西

    所以在你的情况下,它们不是构造函数的属性(这是对它们进行思考的一种无益的方式); 相反,它们是您的实例的属性

    调用的函数在window范围内执行,所以如果你只是调用你的函数, this.foo等将在window上设置属性。

    但是,如果您实例化函数,则它们将成为实例的属性,因为实例是从实例化而非调用的函数(构造函数)隐式返回的。 所以:

    调用:在默认上下文window中设置属性:

    function static_func() { this.foo = 'bar'; }
    static_func();
    window.foo; //'bar'
    

    实例化:在返回的实例上设置属性

    function constructor(val) { this.foo = val; }
    var instance = new constructor('bar');
    window.foo; //undefined
    instance.foo; //'bar'
    

    所以你很困惑为什么当你将它保存在一个变量中时,它后面不是“this”? 有几个原因为什么自我在以后的关键事件中不是“这个”。

    当keyup事件被称为的结果<input id="anyInputElement" />时,keyup事件的回调函数的this将是该输入。 这是因为已经创建了一个新的执行上下文,导致this其分配给该元素。

    那么为什么不是你self ,你分配给this ,而不是输入元素?

    执行上下文是基于堆栈的。 所以当父函数foo被新实例化时,它会创建自己的执行上下文。 这是在密钥回调中使用的执行上下文的父上下文,因为它在堆栈中较低。 每个执行上下文还包含一个词汇和可变环境。 这些环境包含可用变量(命名碰撞结果变量覆盖词法)。

    function foo(id)
    {
     var self = this;  //parent context
     this.element.addEventListener("keyup", function(){
      self.bar();  //child context
     }, false);
    }
    

    词汇环境包含父级环境中的所有变量(这就是为什么window可以从任何地方访问的原因)。 所以这里的子执行上下文(在keyup回调中)在其词汇环境中包含self

    self包含的副本this从父执行上下文。

    因此,当使用self时,即是被访问的执行上下文(包括词法和变量环境)。 这是foo的属性来自哪里。 请注意,由于KEYUP回调创造了自己的执行环境,它也有一个新创建的this (这意味着自我!=这个keyup事件监听器内)。

    相关:保存对此范围的访问权限

    链接地址: http://www.djcxy.com/p/30091.html

    上一篇: Understanding Prototype and this

    下一篇: Visibility of prototype property of a function vs. object on console