JS学习的几点思考(一)

来源:互联网 发布:营销视频制作软件 编辑:程序博客网 时间:2024/06/07 11:41

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;(要判断是否有默认行为)
传送门

明天继续๑乛◡乛๑

原创粉丝点击