【原】关于JS中的作用域——this关键字

无论什么时候,javascript都会把this放到function内部

它是基于一种非常简单的思想——如果包含this的 (特别强调!每个函数都有this。看上面的那句话。)最近的 函数 直接是某个对象的成员。那么this的值就是这个对象。如果包含this的最近的函数 不是某个对象的成员,那么this的值便设为某种全局对象(常见为浏览器中的window对象)。

 

下面的内部函数可以清晰的看出这种思想。

一个函数,若是分配到某个变量的,即不属于任何对象下的一员,那么this的参数就变为window对象。

var obj = {
  toString:function(){//重写toString函数。这里说明下,默认情况下,Object对象都有一个toString的方法。
    return "obj的范围内";
  },
  func:function(){
    alert(this);//这里的函数直接从属于对象obj
    var innerFunc = function(){//这里的函数不是特定对象的直接成员,只是另一个函数的变量而已。
      alert(this);
    };
    innerFunc();
  }
};
obj.func()

 结果:

以此输出“obj的范围内”和“Object Window(FF下测试)”

 

但是我们可以人为的改变作用域,即改变this指向的对象。

如果最后一行代码换为obj.func.call(window)。

那么两次输出的结果都为“Object Window(FF下测试)”

 

从上面的例子可以发现,call实际是另外一个方法,属于JS的语言核心(Runtime)为obj.func提供的内建方法。

无论是哪一个函数,主要能够typeof foo == "function"是成立的,就必然有call的方法。

 

修改下代码:

var obj = {
  toString:function(){//重写toString函数。这里说明下,默认情况下,Object对象都有一个toString的方法。
    return "obj的范围内";
  },
  func:function(){
    alert(this);//这里的函数直接从属于对象obj
    var innerFunc = function(){//这里的函数不是特定对象的直接成员,只是另一个函数的变量而已。
      alert(this);
    };
    innerFunc.call(this);
  }
};
obj.func()

 这样,2次打印的结果都是"obj的范围内"。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值