我一直在分析一些javscript源代码,发现一个对象声明与普通程序略有不同,然后在程序中如何使用它。它声明为这样
window.ext = {};
它的属性已添加到常用程序中,如此
ext.webRequest = {
Property1/function2 : Property
Property2/function2: function()
}
我怀疑是
答案 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
活动。