首页 > 技术笔记 > javascript > 从几行js代码说this的工作机制
2014
11-29

从几行js代码说this的工作机制

昨天晚上下班之前同事让我看一段js代码,说一下输出结果,虽然代码只有几行,看起来也很简单,但是最后执行输出的结果与我们的猜想却并不一样。代码是这样的。 大部分人看到这部分代码可能会说输出结果是“My Object”,但是执行输出的结果却是“The Window”。至于为什么,其实很简单。 JS的方法中的this指向,默认是谁调用指向谁,object.getNameFunc()()相当于var a = object.getNameFunc(); a();调用a的时候没有调用者,则默认是window,那么this.name就是window.name; 我也是昨晚回家在地铁上找到的答案,顺便查阅了一下js中this的工作机制,分享给大家: 与其他编程语言相比,Javascript 对 this 的使用是一套完全不同的机制。this 在五种情况下的值是各有不同的。

全局作用域下

当在全局作用域中使用 this,它指向全局对象。这里详细介绍下全局对象:
全局对象(Global object) 是在进入任何执行上下文之前就已经创建了的对象;这个对象只存在一份,它的属性在程序中任何地方都可以访问,全局对象的生命周期终止于程序退出那一刻。全局对象初始创建阶段将 Math、String、Date、parseInt 作为自身属性,等属性初始化,同样也可以有额外创建的其它对象作为属性(其可以指向到全局对象自身)。例如,在 DOM 中,全局对象的 window 属性就可以引用全局对象自身。所以在 console 内输入 window 和 this.window 是一样的。

调用一个函数时

在这里,this 同样指向全局对象。

调用一个方法时

在这个例子中,this 将会指向 test 对象。

调用一个构造函数时

一个函数在被调用时和关键字 new 一起使用,我们称之为构造函数。此时在函数内,this 指向新建的对象。

显式设置时

当使用 Function.prototype 的 apply 和 call 方法时,this 的值为显式设置为该方法的第一个参数。 因此,不同于调用一个函数时的规则,上例中 this 指向了 bar。 这里介绍下 call 和 apply 方法:
call 方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象。 apply 方法: 语法:apply([thisObj[,argArray]]) 定义:应用某一对象的一个方法,用另一个对象替换当前对象。
在这里我们要注意一点,在对象的字面声明时,this 不能用来指向对象本身。如下: 这里,this 不会指向 obj,this 的应用只限于以上五种情形。

总结

尽管上述情形在大多时候是有意义的,但是第二种情形(即调用一个函数时)的 this 实际上是很少有用途的,这被认为是 Javascript 设计上的另一个错误。 根据我们上面所述,这里的 this 将会指向全局对象,而不是 Foo 函数。 为了在 test 中获得指向 Foo 的途径,我们需要在 method 内部创建一个局部变量指向 Foo。 that 只是普通的变量名,但是它经常被用来指向外部的 this。 还有一个比较有意思的地方与函数别名相关,即将一个方法赋值给一个变量时。 上例中,test 将会被当做一个普通函数看待,所以根据第二种情形(即调用一个函数时),其内部的 this 将会指向全局变量,而不是 someObject。 尽管,this 晚绑定初看上去是个不好的决定,但实际上这是原型式继承工作的基础。 此时,当 method 被调用时,它将指向 Bar 的实例对象。
最后编辑:
作者:射雕天龙
转载请注明:转载自射雕天龙的博客(http://blog.wangjunfeng.com)
捐 赠如果您觉得这篇文章有用处,请支持作者!鼓励作者写出更好更多的文章!

从几行js代码说this的工作机制》有 4 条评论

  1. 李阳博客 说:

    应该和JAVA的this差不多吧。谁调用这个this就指的是谁。

  2. 活动分享 说:

    博主辛苦了,欢迎来回访

  3. 网络兼职 说:

    高科技

留下一个回复

你的email不会被公开。