var a=3;
alert(window.a);
alert(window[ "a" ]);
可以发现两者结果一样,因为a相当于window对象的属性,而对象调属性,既可点号调,又可中括号调,只不过后者一定需要加上双引号。
而如果
var a={
b:function( ){
alert(1);
}
}
这里a变成了对象,window.a可以叫做对象的对象。这个时候调b方法,可以window.a.b()这样调,也可以写成
window[ "a" ][ "b" ]( )这么调。看起来怪怪的,但仍是正确的写法。
===========================================================================
命名空间需要利用到匿名函数,闭包等知识,
( function( ){
function $(id){
return document.getElementById(id);
}
function alertNodeName(id){
alert($(id).nodeName);
}
} ) ( );
由于不同合作者之间写代码,也许没沟通好命名或者就是要彻底避免该问题,可以采用
( function( ){
} ) ( )
来避免全局变量污染,将自己定义的变量或者函数体封装在一个匿名函数中,这时匿名函数会自动调用执行,但执行完毕后,由于函数有作用域,所以外部无法访问匿名函数体中定义的变量和方法,这样就有效避免了冲突。
这个时候如果外部要调用该代码,则可以将其变量或者方法赋给window,具体实现代码如下:
<p id=" f ">我们都是好孩子</p>
( function( ){
function $(id){
return document.getElementById(id);
}
function alertNodeName(id){
alert($(id).nodeName);
}
window[" haha "]={ }
window[" haha "][" showNodeName "]=alertNodeName;
})( );
这里window[" haha "]={ },haha是我们自己定义的nameSpace(命名空间,这个再和别人一样,那就没办法乐不冲突啦,尽量别致),而showNodeName又是haha对象里定义的方法,再将alertNodeName函数的引用赋给它们,这个时候window[" haha "][" showNodeName "]就有了alertNodeName函数的功能。于是:
window[" haha "][" showNodeName "](“f”)会显示" P ",说明nodeName是p。