今天晚些时候,我滚动浏览ejon.com的幻灯片,发现了以下内容:
给我这个密码
function katana () { this.myvar = true; } katana (); console.info (myvar);
在编译代码的那一刻,我认为myvar附加到了katana函数。实际上,它会附加到窗口对象,这会污染全局命名空间。
function katana () { this.myvar = true; } var xyz = new katana(); console.info (myvar);
我有一个function对象,而不是执行这个函数,我只是创建了它的一个新实例(实际上我不太确定发生了什么)。然后我使用xyz存储值,并通过原型方法使用这些值来执行一些工作。
我做了更多的调试,xyz对象被附加到window>对象,但在DOM中它并不明显,也没有痕迹。在调试窗口中还有一些新的东西,一个名为'scopechain'的节点带有一个调用,它具有xyz对象的值。
好吧,下面发生了什么?这是我应该坚持的好方法还是我应该寻找一个替代方法?
当你说 new katana() katana 函数,新的空白对象为 this . 一旦它返回(大概是初始化的)新对象(或者其他什么) 返回,只要它是一个对象)设置为它的“原型”(它将从中继承字段等的对象)与 卡塔纳 函数的原型。
new katana()
katana
this
卡塔纳
是啊,我第一次看的时候也没什么意义。你说,过于简单化的版本是 ,Javascript将创建一个 卡塔纳 卡塔纳 katana() ,和 这 基本上是调用堆栈中在实例方法调用中使用的最后一个对象(如果你的来电者是 x.foo , this == x )如果没有这样的物体,似乎 这 与相同 window .
katana()
这
x.foo
this == x
window
至于为什么 xyz var window.xyz .
xyz
var
window.xyz