最近在看《Javascript 高级程序设计第三版》,用了两周把前七章磕磕绊绊的读完了,也阅读了许多大牛们写的博客,对 JS 的理解有了很大的提高,不过要将这么多的知识全部融会贯通还有还需要多多练习,加深自己的理解,今天就将自己迷糊的几个地方列出来写写自己的理解,新手小白,如有错误欢迎大家指正 (:
1、原型链和作用域链的概念模糊
这个问题可能有人觉得很无厘头,不过确实在我学习过程中突然出现而且让我产生很大的困扰,觉得是不是之前自己的理解就出现很大的问题。出现这个问题的原因是第七章函数表达式,原先在单独看执行环境已经作用域链的时候感觉没有任何疑惑,单独看原型链的时候虽然遇到一些问题不过也理解了,不过在看书中对闭包的执行过程的分析的时候直觉感觉变量应该沿着原型链到原型中去查找 (>_<|||) 。原型链是用来查找对象属性的,而作用域链是用来查找变量的,二者并没有直接的联系,我想我产生疑惑的主要原因还是对 JS 中的函数也是对象的概念理解的不够透彻,对象有自己的属性,所以函数也有自己的属性,而原型链的目的就是为了让函数对象的方法更好的继承:
- var m = 0
- function A(){
- this.property = true;
- };
- A.prototype.fun1 = function(){
- alert(m);
- return this.property;
- }
- var b = new A();
- alert(b.property);
- alert(b.fun1());
prototype 是每个函数都有的属性,当调用 A 构造函数创建一个实例 b 的时候,b 就拥有了一个属性 property,而 b 的 fun1 方法是从其原型 A.prototype 中继承而来;
fun1 执行时,会现在其自己的活动对象中找 m,没找到则会沿着作用域链到全局变量对象中找,m=0;
2、函数的执行环境 excution context
我现在的理解是函数的执行环境只和函数定义的位置有关而与函数调用的位置以及调用函数的对象无关 (this 指向调用函数的对象);
- function a() {
- var a1 = 10;
- b();
- }
- function b() {
- var b1 = 20;
- alert(a1);
- }
- a(); //Uncaught ReferenceError: a1 is not defined
b 虽然在 a 中调用,但是是定义在全局中的函数, 执行到 b 时,它的活动对象中只有 b1,而上一层的变量对象为全局变量对象,全局变量对象中只有 a,b(我的理解此处是指向 a,b 函数的指针),所以在作用域链中并没有 a1;
以上。
第一次写博客,条理不是很清楚,如果有理解的不对的地方,欢迎拍砖。加油!
来源: