首页 > 代码库 > this的使用
this的使用
(1)全局环境
在全局环境使用this
,它指的就是顶层对象window
。
this === window // true
function 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
原文链接:
http://javascript.ruanyifeng.com/oop/this.html
this的使用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。