此文都是大牛们关于闭包的观点,在此只是总结。
闭包应用的两种情况即可——函数作为返回值,函数作为参数传递。
判断一个变量是不是对象非常简单。值类型的类型判断用typeof,引用类型的类型判断用instanceof。
对象里面的一切都是属性,只有属性,没有方法。方法也是一种属性。因为它的属性表示为键值对的形式。
javascript中的对象可以任意的扩展属性。
var obj={ a : 10, b : function(x){ return this.a+x; } c:{ name:'王', year:1999 } }
var fn = function () { alert(100); }; fn.a = 10; fn.b = function () { alert(123); }; fn.c = { name: "王", year: 1988 };
一切(引用类型)都是对象,对象是属性的集合
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。
在函数外部自然无法读取函数内的局部变量。
Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
function f1(){ var n=999; function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999
闭包就是能够读取其他函数内部变量的函数。
可以把闭包简单理解成"定义在一个函数内部的函数"。
最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
当一个函数作为函数而不是方法来调用的时候,this指向的是全局对象?函数中的this指的是调用这个函数的owner
思考题很关键呀~
现在比较让人认同的闭包实现有如下三种
with(obj){ //这里是对象闭包 } (function(){ //函数闭包 })() try{ //... } catch(e) { //catch闭包 但IE里不行 }
让这三个节点的Onclick事件都能正确的弹出相应的参数。
1 使用函数闭包。 var lists = document.getElementsByTagName("li"); for(var i=0,l=lists.length; i < l; i++){ lists[i].onclick = (function(i){//保存于外部函函数 return function(){ alert(i); } })(i); } 2 利用事件代理 var ul = document.getElementsByTagName("ul")[0]; ul.onclick = function(){ var e = arguments[0] || window.event, target = e.srcElement ? e.srcElement : e.target; if(target.nodeName.toLowerCase() == "li"){ alert(target.id.slice(-1)) } }
slice() 方法可从已有的数组中返回选定的元素。包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。
如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个我们通常所谓的“闭包”。
东西太多,看不明白了,先mark上吧~