了解原型和这个
这个问题在这里已经有了答案:
在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