代码之家  ›  专栏  ›  技术社区  ›  Omar Abid

JavaScript新关键字和对象范围

  •  3
  • Omar Abid  · 技术社区  · 14 年前

    今天晚些时候,我滚动浏览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对象的值。

    好吧,下面发生了什么?这是我应该坚持的好方法还是我应该寻找一个替代方法?

    1 回复  |  直到 14 年前
        1
  •  3
  •   cHao    14 年前

    当你说 new katana() katana 函数,新的空白对象为 this . 一旦它返回(大概是初始化的)新对象(或者其他什么) 返回,只要它是一个对象)设置为它的“原型”(它将从中继承字段等的对象)与 卡塔纳 函数的原型。

    是啊,我第一次看的时候也没什么意义。你说,过于简单化的版本是 ,Javascript将创建一个 卡塔纳 卡塔纳 katana() ,和 基本上是调用堆栈中在实例方法调用中使用的最后一个对象(如果你的来电者是 x.foo , this == x )如果没有这样的物体,似乎 与相同 window .

    至于为什么 xyz var window.xyz .