1,js里面的类数组,实际上之前一直被误导为json,即var a ={‘name’:’eric’,’age’:18},这其实是js里面类数组,具有数组的length属性,即a.length=2,但是没有具有数组的一些方法,要对类数组进行操作的话,就要通过Array.prototype.splice[此处是数组具有的方法].call(a,参数,参数)。引用个例子
function printArgs() {
Array.prototype.forEach.call(arguments,
function (arg, i) {
console.log(i+'. '+arg);
});
}
> printArgs()
> printArgs('a')
0. a
> printArgs('a', 'b')
0. a
1. b
这里用call的第二个参数是函数,js里面函数也是对象,可以理解为处理函数。下面的例子是’正常‘的call
> var obj = {};
> Array.prototype.push.call(obj, 'a');
1
> obj
{ '0': 'a', length: 1 }
2,函数的原型链。每一个对象都有proto,只有函数才有prototype。JS在声明一个函数的时候,会为该函数对象创建一个私有的prototype,当new这个函数的时候,js创建该函数的实例,并且把实例的proto 指向函数的prototype,并且继承该函数prototype的所有属性和方法。prototype是用来共享信息的,构造函数中的赋值都是私有的,无法共享的。形象的理解构造函数的prototype在最金字塔的最顶层,当prototype发生改变的时候,会共享数据改变。
学习传送门
3,关于构造函数的继承
4,js闭包。通俗一点理解就是,在全局中访问函数的局部变量,这只需在函数里面嵌套函数,在嵌套函数(子)里面访问父的变量,并且把这个函数返回。
闭包会引起内存泄漏,解决的方法是在函数退出之前,删除局部变量。这是阮一峰老师在博客说的,但是网上又说闭包的内存泄漏是IE的问题。下面介绍下js的垃圾回收:
mark-and-sweep,主要有两种方法,一种是标记法,GC在变量运行的时候维护一个roots表,所有的全局变量都会在这个表里面,首先被标记为激活状态,然后检查这个root以及下面的子变量是可到达,如果不可到达,就会被去掉。另外一种是计数法,当声明了一个变量,并且这个变量被其他的变量引用的时候,就会被增加一个计数,当引用变量不对这个变量引用的时候,就变-1,当为0的时候,启动GC。(互相引用的时候无法删除)
几种引起内存泄漏: 在局部函数没有用var导致成为全局变量,回调函数没有即使删除,脱离DOM的引用(标记清除不了)
传输门一 传送门二 阮一峰老师闭包教程
5,event和e的区别。主要是不兼容的产生的不同命名。此外说下困扰很久的问题,在js当中,实际参数和形参不是对应的,所以没有传入event也会默认有,和argument一样是存在的。一般来说,要var eve = e || windows.event。在此展开一下event事件的方法:
阻止冒泡,e.stopPropagation(); window.event.cancelBubble = true;举个栗子:
<div id='div' onclick='alert("div");'>
<ul onclick='alert("ul");'>
<li onclick='alert("li");'>test</li>
</ul>
</div>
阻止默认行为:e.preventDefault(),windows.returnValue=true;(要判断是否有默认行为)
传送门
明天继续๑乛◡乛๑