关于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;

    以上。

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

时间: 2024-08-27 07:34:23

关于JS的原型链和作用域链的相关文章

原型链和作用域链

一.原型链: 1.原型对象: 每一个构造函数都有一个prototype属性,这个属性就叫原型对象. 每一个构造函数new出来的对象都有一个--proto--属性,这个属性指向原型对象. <script> function Car(){ //实例属性: //this.produce = 'chevrolet', this.price = 8800000; } //原型属性: Car.prototype.produce = "BMW"; var chevrolet = new

JavaScript原型链与作用域链

layout: 'page' title: '原型链与作用域链' date: 2019-09-30 15:38:38 tags: JAVASCRIPT categories: JAVASCRIPT 原型 所有函数自带一个属性:prototype,属性值是一个对象,存储供实例调用的公共方法 这个对象自带属性constructor,属性值是函数本身 每个对象自带_ _proto__的属性,这个属性指向当前实例所属类的prototype(如果不能确定他是谁的实例,都是Object的实例) 原型链 如果

2. 原型链_作用域链_预处理_预解析

1. 谈谈原型 能够实现继承,对象查找属性的规则 实例对象的隐式原型的值 为其 对应构造函数的 显式原型的值 prototype 显示原型属性 所有函数都有显示原型属性 __proto__ 隐式原型属性 所有实例对象都有隐式原型属性 所有函数都是 Function 的实例 Function 是通过 new 自己产生的实例 2. 谈谈原型 由多个隐式原型属性构成的链状结构就是原型链 作用: 用来查找对象的 属性/方法 先自身找,找不到再去 __proto__ 找,最终找到 Object.proto

关于原型链和作用域链的终点问题

1 <script language="javascript" type="text/javascript"> 2 function A(){ 3 this.a=11; 4 this.getA=function(){ 5 return this.a; 6 } 7 } 8 A.prototype.b=33; 9 Object.prototype.b=22; 10 var k=new A() 11 alert(k.b);//33; 12 </scrip

js的执行环境和作用域链

执行环境 js的执行环境就是:定义了变量或函数有权访问的其他数据,决定了它们各自的行为.每个环境都有一个与之相关联的对象,环境中定义的变量和函数都保存在这个对象中. 全局变量就是最外围的环境,通常被认为是window对象.全局变量和局部变量会在环境栈中,当执行环境在执行完环境中的所有代码后会销毁,环境栈会将该栈弹出,定义的变量与函数也会被销毁,而全局变量会在程序退出后销毁. 作用域链 作用域是保证对执行环境有权访问  的所有变量  的有序访问. 链的形成: 作用域链的前端是当前执行环境的变量对象

原型及原型链及作用域链

原型:所有的函数都有一个特殊的属性prototype(原型),prototype属性是一个指针,指向的是一个对象(原型对象),原型对象中的方法和属性都可以被函数的实例所共享.所谓的函数实例是指以函数作为构造函数创建的对象,这些对象实例都可以共享构造函数的原型的方法. 原型链:原型链是用于查找引用类型(对象)的属性,查找属性会沿着原型链依次进行,如果找到该属性会停止搜索并做相应的操作,否则将会沿着原型链依次查找直到结尾.常见的应用是用在创建对象和继承中. 例子: 解析: 函数Person中有一个原

JS高级 -- 执行上下文与作用域链

这个问题涉及到三个点: 1. 执行上下文 2. 函数嵌套导致的执行上下文栈 3.闭包 1 <script> 2 var a = 1; 3 var f1 = function(){//第一个函数 4 var a = 2; 5 var b = 1; 6 7 var f2 = function(){//第二个函数 8 var c = 1; 9 var f3 = function(){//第三个函数 //第三个函数执行,他自己的执行上下文中没有a,b,c,则从父级函数f2的执行上下文中去找,f2中有c

标识符解析、作用域链、运行期上下文、原型链、闭包

本文讲到的是如何从数据访问层面上提高JS 代码的执行效率.总的来讲有以下几条原则: 函数中读写局部变量总是最快的,而全局变量的读取则是最慢的: 尽可能地少用with 语句,因为它会增加with 语句以外的数据的访问代价: 闭包尽管强大,但不可滥用,否则会影响到执行速度以及内存: 嵌套的对象成员会明显影响性能,尽量少用: 避免多次访问对象成员或函数中的全局变量,尽量将它们赋值给局部变量以缓存. 这么几句话看似简单,但要深刻理解其中的道理则需涉及到JS的 标识符解析.作用域链.运行期上下文(又称为执

JS详细图解作用域链与闭包

JS详细图解作用域链与闭包 攻克闭包难题 初学JavaScript的时候,我在学习闭包上,走了很多弯路.而这次重新回过头来对基础知识进行梳理,要讲清楚闭包,也是一个非常大的挑战. 闭包有多重要?如果你是初入前端的朋友,我没有办法直观的告诉你闭包在实际开发中的无处不在,但是我可以告诉你,前端面试,必问闭包.面试官们常常用对闭包的了解程度来判定面试者的基础水平,保守估计,10个前端面试者,至少5个都死在闭包上. 可是为什么,闭包如此重要,还是有那么多人没有搞清楚呢?是因为大家不愿意学习吗?还真不是,