闭包
即时运行函数写法:
- ~function(){}() //位操作符,+也行,因为操作符后面是表达式,不会解释成函数定义语句和()连接
- (function fun() {})() // 这是一个函数表达式(放在需要表达式的地方),‘fun’是函数名称,只能在内部使用。
===
闭包陷阱
for(var i=1;i<=5;i++){setTimeout(function(){console.log(i);}, i*1000);}
闭包有个重要的作用就是,在内层函数引用外层函数定义的变量时,外层函数的变量会被持久化。可用作缓存数据
function f() {var cache=0;//cache保存在这个域中。。。return function() {return ++cache}}var cun = f(); // cun 没有删除,那它就始终指向f()中的函数,即cache一直没有被GC(垃圾回收Garbage Collection)cun(); // > 1cun(); // > 2;调用cache,cache的值一直增加function Range (from,to) {this.from = function(){return from;}this.to= function(){return to;}}var r = new Range(1,7);//r对象有2个方法from()返回1(function() {//立即调用,对象继承属性objectId,引用了idGetter方法Object.defineProperty(Object.prototype, "objectId", {get: idGetter});function idGetter() {if (!this.ID) {Object.defineProperty(this, "ID", {value : nextid++,writable : false,enumerable : false,configurable : false});}return this.ID;}var nextid = 1;})();var getObjectId = (function(id, map) {return function(obj) {return map.get(obj) || (map.set(obj, ++id), id)}}(0, new WeakMap));