!!javascript 作用域链的原理和原型链

在一个函数中,运行时,碰到一个标识符。

      标识符是x,其可能是局部变量,或者外层变量,或者全局变量,或者函数对象自身的属性。

     1. 在作用域链中查找。如果找不到2.在原型链上找。

     2.标识符x.a,包括this.a。先像上一步找到x,在x的原型链中找到a.


function a()
{
    this.x=function  x()
    {
        alert("aa");
    }
}


function b()
{
     function  x()
    {
        alert("ab");
    }

     x();
     b.prototype.x();

};

b.prototype=new a;
b.constructor=b;



b();//  alert("ab");alert("aa");



考虑

class A0

{

   int a;//实例变量a0.

   void A1()

   {

        int a;//局部变量a1

        void A2()

        {

                int a;//局部变量a2

                a=0;//显然此处的a为a2.先按作用域链来找,找不到,再按原型链来找。

        }

   }

}




二维作用域链查找

在作用域链中查找变量对象的属性(如果有的话)须考虑其中--源于ECMAScript 的原型特性。

如果一个属性在对象中没有直接找到,查询将在原型链中继续。即常说的二维链查找。


(1)作用域链环节;(2)每个作用域链--深入到原型链环节。如果在Object.prototype 中定义了属性,我们能看到这种效果。

function foo() {
  alert(x);
}
 
Object.prototype.x = 10;
 
foo(); // 10,在作用域找不到,在原型链中找

活动对象没有原型,我们可以在下面的例子中看到:

function foo() {
 
  var x = 20;
 
  function bar() {
    alert(x);
  }
 
  bar();
}
 
Object.prototype.x = 10;
 
foo(); // 20,在作用域中找到了,不必再到原型中去找。



你可能感兴趣的:(!!javascript 作用域链的原理和原型链)