首页 > 网站开发文档 > 网站设计与开发 > 阅读

JS函数不同调用模式下,this的指向问题

分享到:
作者:小火 来源:特嘉聚 浏览:2272 日期:08-20 我要评论(0)
 先看一段有意思的代码:
var length = 10;function fn() {  console.log(this.length);}var obj = {  length: 5,  method: function(fn) {    fn();    arguments[0]();  }};obj.method(fn,1);

猜猜输出结果是什么?

浏览器环境

输出结果是10和2。

先说第一个:

执行过程大致如下:

obj.method这是个obj对象的方法,而传入的fn是个函数,fn()属于调用模式的"函数调用",非严格模式下,this为global对象(浏览器中就是window)。

而在这段代码的最上方使用var定义了length,由于var是直接写在global作用域中的,所以此处的 var length 与 window.length是同一个东西。输出10也就不奇怪了。

那么来看第二个:

arguments这个是在函数内部才有的参数,很像array,而且typeof得到的也是object值,我们知道,js访问对象有 . 操作符 和 中括号操作符,此处使用的是第二种方法获取到obj.method的第一个参数,也就是fn.

由于arguments[0]()是输入调用方式中的"方法调用模式",this指向对象本身,也就是arguments,所以会输出2。

Nodejs环境

这段代码在nodejs下面会输出

undefined

2

第二个输出2的原因跟浏览器下一致,就不说了,来看看第一个undefined

根本原因在于nodejs的global处理机制不同。

global贯穿与nodejs整合生命周期,而每个js文件是单独的模块,就算使用var定义在顶层,也只是这个module的全局变量。所以会输出undefined、

作者:每天进步一点点(ddhigh#com)

我要评论

昵称:
点击刷新

网友评论

合作咨询

  • 已有 736 位客户做了同样的选择

微信扫一扫 立即开始咨询

搜索公众号:tejiaju
客户服务热线:028-66886061     QQ:635355028
© 2000-2021 四川特嘉聚科技有限公司 版权所有 蜀ICP备15001814号-5