function NameSpace(ns) { if (!ns) { return null; } var arr = ns.split('.'); //第一次调用的时候window.utry的值为{}; //第二次调用的时候window.utry的值为window.utry; window[arr[0]] = window[arr[0]] || {}; //obj是window.utry的引用 var obj = window[arr[0]]; //result也是window.utry的引用 var result = obj; var len = arr.length; //注意i是从1开始的 for (var i = 1; i < len; i++) { //第一次调用的第一次循环obj.base的值是{}; //因为obj是window.utry的引用,那么window.utry.base的值就是{}; obj[arr[i]] = obj[arr[i]] || {}; //obj变成了window.utry.base的引用 //第二次循环的时候,就变成了对window.utry.base.sys的赋值了 obj = obj[arr[i]]; } return result; } NameSpace("utry.base.sys"); utry.base.sys.fn = function () { alert("这是名称空间里的一个方法"); } //这是为了证明函数不会被覆盖掉 NameSpace("utry.base.sys"); utry.base.sys.fn(); //咦,这样可以打印出函数体 alert(utry.base.sys.fn);