涵义
this都有一个共同点:它总是返回一个对象。
var person = {name: '张三',describe: function () {return '姓名:'+ this.name;}};person.describe()// "姓名:张三"
<input type="text" name="age" size=3 onChange="validate(this, 18, 99);"><script>function validate(obj, lowval, hival){if ((obj.value < lowval) || (obj.value > hival))console.log('Invalid Value!');}</script>
上面代码是一个文本输入框,每当用户输入一个值,就会调用onChange回调函数,验证这个值是否在指定范围。浏览器会向回调函数传入当前对象,因此this就代表传入当前对象(即文本框),然后就可以从this.value上面读到用户的输入值。
var f = function () {console.log(this.x);}var x = 1;var obj = {f: f,x: 2,};// 单独执行f() // 1// obj 环境执行obj.f() // 2
上面代码中,函数f在全局环境执行,this.x指向全局环境的x;在obj环境执行,this.x指向obj.x。
如果对象的方法里面包含this,this的指向就是方法运行时所在的对象。该方法赋值给另一个对象,就会改变this的指向。
var obj ={foo: function () {console.log(this);}};obj.foo() // obj
如果this所在的方法不在对象的第一层,这时this只是指向当前一层的对象,而不会继承更上面的层。
var a = {p: 'Hello',b: {m: function() {console.log(this.p);}}};a.b.m() // undefined
上面代码中,a.b.m方法在a对象的第二层,该方法内部的this不是指向a,而是指向a.b,因为实际执行的是下面的代码。
var b = {m: function() {console.log(this.p);}};var a = {p: 'Hello',b: b};(a.b).m() // 等同于 b.m()
