Gather ye rosebuds while ye may

JS笔记


这几天主要是在看JS,小本本上记录了一些(私以为)具有代表性的要点,这里写一遍再加深一下印象。

原型链

code 1/2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var base = {
name: 'base',
getInfo: function() {
return this.name;
}
}

var ext1 = {
id: 1,
__proto__: base
}

var ext2 = {
id: 2,
__proto__: base
}


code 2/2:
1
2
3
4
5
6
7
8
9
10
11
12
13
function Task(id) {
this.id;
}

Task.prototype.status = "stopped";

Task.prototype.execute = function() {
return this.id + this.status;
}

var task1 = Task(1)
var task2 = Task(2)
task1.status = "active";


事件

html如下:

1
2
3
4
5
6
<div id="baba">
<div id="gege">
<div id="wo">
</div>
</div>
</div>

js:
1
2
3
wo.addEventListener("click", function(e){
alert("wo");
}, false);

这里false是指注册冒泡事件,若为true就是捕获。

先捕获后冒泡,先注册先执行。

e.stopPropagation()停止冒泡和捕获。

removeEventListener取消注册需要三个参数均相同。


闭包

1
2
3
4
5
6
7
8
9
function a() {      嵌套的func
var i = 0; 内部变量
function b() {
alert(++i); 内部func向外传递变量值
}
return b; 返回内部的func
}
var c = a(); 实例化外部func
c();

变量以函数分界,注意不包括for
没有用var的变量默认为全局变量

顺序

css和image加载时不会终止页面加载,js会等加载完再继续。
加载完之后js预编译,优先函数的定义,然后创建var foo = undefined,之后执行,变量才开始在原型链中找值,找不到再到作用域中找。

1
2
3
4
f();
function f() {
alert(0);
}

上面由于函数是由构造函数function定义的,所以会先预编译,待执行时f()已经有相应的组成了。
1
2
3
4
f();
f = function() {
alert(0);
}

这里f变量的值由匿名函数来,变量在原型链/作用域中找值要晚于顺序执行,所以这段代码运行时会报错,说f并未定义。


以上