Javascirpt 排障(一)

this 关键字


 

this关键字是指上下文对象,既被调用函数所处的运行环境。上下文对象的作用是一个函数内部引用调用它的对象本身。

看一下代码:

function Person(){
   this.name='DanDan';
   function PrintName(){
    console.log(this.name);
   };
   this.PrintName=PrintName;
}

var my=new Person();
my.PrintName();

定义一个Person函数,实例化my后我们用my去调用PrintName(),因为this指“调用它的对象本身”的是里面的this已经换成了my,所以这是时候输出的结果是,DanDan。

 如果我们换成一下代码:

function Person(){
   this.name='DanDan';
   function PrintName(){
    console.log(this.name);
   }();
   this.PrintName=PrintName;
}

var my=new Person();
my.PrintName();

既在Person中定义Print函数的时候就执行一遍,这时候的this就已经换成了PrintName函数本身,而PintName函数本身是没有name属性的,所以会报错。

这样就比较好理解了this关键字了,可以这样说函数的作用域是静态作用域(下面有解释),在定义的时候就已经有形成了,而this相当于是动态的,只有在你调用的时候你才知道this指的是什么。所以this和函数的作用域结合其他之后就可以补充静态作用域的不足了。

函数的作用域


 引用一个例子:

var scope='global';

var fn=function(){
   console.log(scope);
   var scope='fn';
}
fn();

 

结果是:

因为在fn的作用域是在定义的时候就已经形成了,console.log(scope)的时候,fn发现他内部是有一个scope的,所以不会网上找scope=‘global’那个。但是我们运行console.log(scope)时scope却是还没有赋值的所以输出的是undefined。

posted @ 2013-07-13 20:55  rovoqo  阅读(197)  评论(0编辑  收藏  举报