关于JS的原型链和作用域链

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于JS的原型链和作用域链相关的知识,希望对你有一定的参考价值。

  最近在看《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;

    以上。

 

  第一次写博客,条理不是很清楚,如果有理解的不对的地方,欢迎拍砖。加油!









以上是关于关于JS的原型链和作用域链的主要内容,如果未能解决你的问题,请参考以下文章

JS中的作用域链是在啥时候建立的

原型链和作用域链

作用域链闭包和原型链

js学习笔记之作用域链和闭包

JS 之作用域链和闭包

预编译作用域链和闭包理解