(1)事件模型
JavaScript中有两种时间模型:DOM0,DOM2
DOM0级事件模型是早期的事件模型,所有的浏览器都是支持的,而且其实现在也是比较简单的。
DOM2级时间模型:事件捕获和事件冒泡;注册事件和解除事件。
在DOM2级中使用addEventListener和removeEventListener来注册和解除事件(IE8级之前的版本不支持)。
这种函数较之之前的方法好处是一个dom对象可以注册多个相同类型的事件,不会发生事件的覆盖,会依次的执行各个事件函数。
(2)闭包
比如举个例子:有a,b,c三个函数,b是a的子函数,a返回b,c是a外的一个函数,c引用了a内的子函数b这就创建了一个闭包。闭包是指有权限访问另一个函数作用域的变量的函数。
闭包的作用:说简单就是,闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。
当function里嵌套function时,内部的function可以访问外部function里的变量。
但这还不是闭包。当return的是内部function时,就是一个闭包。内部function会close-over外部function的变量直到内部function结束。
function foo(x) {
var tmp=3;
return function(y){
alert(x+y+(++tmp));
}
}
var bar=foo(2);//bar现在是一个闭包 bar(10)
实际上闭包的概念就是为了避免内存泄漏而存在的,闭包重点(意义)就是理解JS的作用域,理解了作用域,方能更主观的避免内存泄漏(好一点的教程都会将闭包跟作用域联系在一起)。
(3)原型链(看不懂)
JS在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做proto的内置属性,用于指向创建它的函数对象的原型对象prototype。以上面的例子为例:
console.log(zjh.__proto__ === person.prototype) //true
同样,person.prototype对象也有proto属性,它指向创建它的函数对象(Object)的prototype
console.log(person.prototype.__proto__ === Object.prototype) //true
继续,Object.prototype对象也有proto属性,但它比较特殊,为null
console.log(Object.prototype.__proto__) //null
我们把这个有proto串起来的直到Object.prototype.proto为null的链叫做原型链。
pic3.png
网友评论