闭包

即时运行函数写法:

  • ~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(); // > 1
cun(); // > 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));