this是怎么使用的?
程序员文章站
2022-03-29 13:20:36
...
(1)全局环境
在全局环境使用this
,它指的就是顶层对象window
。
this === window // truefunction f() { console.log(this === window); // true}
不管是不是在函数内部,只要是在全局环境下运行,this
就是指顶层对象window
。
(2)构造函数
构造函数中的this
,指的是实例对象。
var Obj = function (p) { this.p = p;};Obj.prototype.m = function() { return this.p;};
上面代码定义了一个构造函数Obj
。由于this
指向实例对象,所以在构造函数内部定义this.p
,就相当于定义实例对象有一个p
属性;然后m
方法可以返回这个p属性。
(3)对象的方法
当A对象的方法被赋予B对象,该方法中的this
就从指向A对象变成了指向B对象。所以要特别小心,将某个对象的方法赋值给另一个对象,会改变this
的指向。
var obj ={ foo: function () {console.log(this); }};obj.foo() // obj
obj.foo
方法执行时,它内部的this
指向obj
。
但是,只有这一种用法(直接在obj
对象上调用foo
方法),this
指向obj
;其他用法时,this
都指向代码块当前所在对象(浏览器为window
对象)。
// 情况一(obj.foo = obj.foo)() // window// 情况二(false || obj.foo)() // window// 情况三(1, obj.foo)() // window
obj.foo
先运算再执行,即使它的值根本没有变化,this
也不再指向obj
了。
可以这样理解,在JavaScript引擎内部,obj
和obj.foo
储存在两个内存地址,简称为M1
和M2
。只有obj.foo()
这样调用时,是从M1
调用M2
,因此this
指向obj
。但是,上面三种情况,都是直接取出M2
进行运算,然后就在全局环境执行运算结果(还是M2
),因此this
指向全局环境。
// 情况一(obj.foo = function () { console.log(this);})()// 情况二(false || function () { console.log(this);})()// 情况三(1, function () { console.log(this);})()
同样的,如果某个方法位于多层对象的内部,这时为了简化书写,把该方法赋值给一个变量,往往会得到意料之外的结果。
var a = { b: {m: function() { console.log(this.p);},p: 'Hello' }};var hello = a.b.m;hello() // undefined
上面代码中,m是多层对象内部的一个方法。为求简便,将其赋值给hello变量,结果调用时,this指向了顶层对象。为了避免这个问题,可以只将m所在的对象赋值给hello,这样调用时,this的指向就不会变。
var hello = a.b;hello.m() // Hello
(4)Node
在Node中,this
的指向又分成两种情况。全局环境中,this
指向全局对象global
;模块环境中,this
指向module.exports。
// 全局环境this === global // true// 模块环境this === module.exports // true
以上就是this是怎么使用的?的详细内容,更多请关注其它相关文章!
上一篇: php 二维数组排序几种方法