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。