六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 19|回复: 0

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

[复制链接]

升级  55.33%

35

主题

35

主题

35

主题

秀才

Rank: 2

积分
133
 楼主| 发表于 2013-1-29 09:28:19 | 显示全部楼层 |阅读模式
无论什么时候,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的范围内"。
 
 
 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表