匿名函数外面加上一个括号,我管它叫"函数标准化",也就是说,可以像标准函数那样调用,如: 复制代码 代码如下: var name =function(){}; (name)();//一般不会这么写;
这么做的好处就是,在()外部无法访问到函数中变量,也就成了块级作用域,这种方式一般用在编写插件的时候,不会再全局 (global)中添加额外的变量,而且,在函数执行完毕之后,其内部定义的变量就被销毁了,所以,也不会有闭包特性存在的问题。 7.2私有变量: 复制代码 代码如下: function private() { var name = "moersing"; this.getName = function(){ return this.name; } }
私有变量实际上就是利用函数的作用域作为限制(外部无法访问),然后定义一个方法,这个方法返回相应的变量,仅此而已。 8.DOM之NodeList: nodeList是一个动态的元素,这意味着,在文档中添加任何元素,nodeList都会实时更新,如: 复制代码 代码如下: var alldiv = document.getElementsByTagName("div"); for(var i=0;i<alldiv.length;i++) { var div = document.createElement("div"); div.innerHTML= i.toString(); document.body.appendChild(div); }
这段代码会造成无限循环,在循环里面创建了一个div,然后appendChild方法将其添加到body中,那么,所有alldiv会立即就更新,所以,i<alldiv.length永远无法成立,要解决这个问题,可以使用下面方式: 复制代码 代码如下: var alldiv = document.getElementsByTagName("div"); var len,i; for(i=0,len=alldiv.length;i<len;i++) { var div = document.createElement("div"); div.innerHTML= i.toString(); document.body.appendChild(div); }
这里建议:最好不要频繁的对NodeList操作,因为每次操作都会执行一次DOM树的查询。 除了以上介绍的方法外,HTML5 新加入的API(selector API Level1)也能解决这个问题,它类似C#的linq及时查询,至于什么是linq及时查询,以后我会更新blog,敬请关注: 复制代码 代码如下: var allDiv= document.querySelectorAll("div"); for(var i=0;i<alldiv.length;i++) { var div = document.createElement("div"); div.innerHTML= i.toString(); document.body.appendChild(div); }