全局地向对象添加属性/方法?

时间:2016-03-11 06:06:55

标签: javascript

我一直在分析一些javscript源代码,发现一个对象声明与普通程序略有不同,然后在程序中如何使用它。它声明为这样

window.ext = {};

它的属性已添加到常用程序中,如此

ext.webRequest = {
    Property1/function2 : Property
    Property2/function2: function()
   }

我怀疑是

  • 省略 window.ext.webrequest 是否正常,只需拨打 ext.webrequest
  • 是否有任何隐藏的理由/优势来声明这样的对象?

2 个答案:

答案 0 :(得分:1)

全局变量存储在全局对象中(这是根据ECMA脚本规范调用它的方式)。

在大多数Web浏览器中,他们调用全局对象window,无需指定其名称即可访问。

所以最终:

window.ext = {};ext = {};是等效的(当且仅当您在同一全局范围内调用它们而不是在嵌套范围内(即函数或对象范围)时)。

  

是否有任何隐藏的理由/优势来声明这样的对象?

优点/原因是声明这样的对象使它们在所有级别都可访问,因为它们将在全局范围内声明。

答案 1 :(得分:1)

  

省略window.ext.webrequest并简单地调用是否正常   ext.webrequest?

,有差异。

Window是一个全局对象,也是一个宿主对象。如果你没有给像obj.ext.webrequest这样的属性提供窗口上下文(或全局),那么JS引擎将

  • 首先在本地上下文中查找此对象,然后查找父对象,直到全局上下文。上下文是在功能级别而不是在块级别定义的。

  • 如果上下文在本地可用,它将使用该值而不是window.ext.webrequest值。

  

是否有任何隐藏的理由/优势来声明这样的对象?

我观察到的一个好处是您想要从onclick属性调用方法,例如

<div onclick="method1()">Click here</div>

这将在全局上下文中自动查找此方法。

但通常我们想等待加载dom(比如JS fiddle这是一个默认设置),在这种情况下你的方法定义包含在document.onload事件处理函数中,如< / p>

document.onload = function(){

   var method1 = function ()
   { 
     //some action here
   }
};

现在这个method1函数在全局上下文中不可见,因此onclick事件将无法找到此方法。

但是如果你将这个方法分配给像这样的全局上下文

document.onload = function(){

   window.method1 = function ()
   { 
     //some action here
   }
};

现在,它可用于onclick活动。