错误的:
var elems = document.getElementsByTagName('a');
for (var i = 0; i < elems.length; i++) {
elems[i].addEventListener('click', function (e) {
e.preventDefault();
alert('I am link #' + i);
}, 'false');
}
正确的:会锁住对应的index的值,虽然i最后为10,但是之前的值,已经记录好了
var elems = document.getElementsByTagName('a');
for (var i = 0; i < elems.length; i++) {
(function (lockedInIndex) {
elems[i].addEventListener('click', function (e) {
e.preventDefault();
alert('I am link #' + lockedInIndex);
}, 'false');
})(i);
}
```
5. 不管什么是自执行,还是立即调用,不用分那么清楚,只需知道立即执行一次匿名函数就够了
# 第五部分,强大的原型和原型链
1. 原型关键词,prototype
2. 说白了,原型就是一个对象
3. 通过hasOwnProperty,区分属性从哪里来的
4. 默认还有一个原型的链条,一直到Object.prototype为止
5. 所有的对象都有"[[prototype]]"属性(通过__proto__访问),该属性对应对象的原型
6. 所有的函数对象都有"prototype"属性,该属性的值会被赋值给该函数创建的对象的"__proto__"属性
7. 所有的原型对象都有"constructor"属性,该属性对应创建所有指向该原型的实例的构造函数
8. 函数对象和原型对象通过"prototype"和"constructor"属性进行相互关联
9. 最简单易懂的看下边
[原型链介绍](https://www.talkingcoder.com/article/6360227501704156372)
# 第六七八部分,S.O.L.I.D五大原则之单一职责SRP(忽略)
The Single Responsibility Principle(单一职责SRP)
The Open/Closed Principle(开闭原则OCP)
The Liskov Substitution Principle(里氏替换原则LSP)
The Interface Segregation Principle(接口分离原则ISP)
The Dependency Inversion Principle(依赖反转原则DIP)
# 第九部分,根本没有“JSON对象”这回事!
简单的说
1. // 这是JSON字符串
var foo = '{ "prop": "val" }';
2. // 这是对象字面量
var bar = { "prop": "val" };
3. // 将字符串反序列化成json对象
var my_obj = JSON.parse( foo );
4. json对象,和字面量对象,明显的区别,前者必须有引号,后者去掉引号可以
var bar = { prop: "val" };合法的
# 第十部分,JavaScript核心(晋级高手必读篇)
1. 执行上下文栈(Execution Context Stack),有三种类型:global, function和eval。
2. 执行上下文(Execution Context),变量对象(variable object),this指针(this value),作用域链(scope chain)
函数表达式[function expression](而不是函数声明[function declarations,区别请参考本系列第2章])是不包含在VO[variable object]里面的
3. 变量对象(variable object) 是与执行上下文相关的 数据作用域(scope of data) 。
它是与上下文关联的特殊对象,用于存储被定义在上下文中的 变量(variables) 和 函数声明(function declarations) 。
4. 当函数被调用者激活,这个特殊的活动对象(activation object) 就被创建了
5. 作用域链的原理和原型链很类似,如果这个变量在自己的作用域中没有,那么它会寻找父级的,直到最顶层。
6. 这表示,在我们去搜寻__parent__之前,首先会去__proto__的链接中。
7. 闭包是一系列代码块(在ECMAScript中是函数),并且静态保存所有父级的作用域。通过这些保存的作用域来搜寻到函数中的自由变量。
8. 在ECMAScript中,是不可以给this赋值的,因为,还是那句话,this不是变量。
9. this是执行上下文环境的一个属性,而不是某个变量对象的属性
# 第十一部分,执行上下文(Execution Contexts)
可以把调用上下文作为第二个参数传递给eval。那么,如果这个上下文存在,就有可能影响“私有”(有人喜欢这样叫它)变量。
# 第十二部分,变量对象(Variable Object)
```angularjs
if (true) {
var a = 1;
} else {
var b = 2;
}
alert(a); // 1
alert(b); // undefined,不是b没有声明,而是b的值是undefined