javascript中this指向的问题

时间:2023-03-10 03:11:54
javascript中this指向的问题

javascript中this只有函数执行时候才能确定到底指向谁,实际this最终指向是那个调用它的对象。

1,匿名函数中的this——window

function foo(){
var lastName = 'miya';
console.log(this.lastName); //undefined
console.log(this); //window
}
foo();

2,作为对象的方法的this

//作为对象方法
var obj = {
a:1,
getA: function(){
console.log( this === obj); //true
console.log(this.a) //
}
} obj.getA();

再看这个例子:

var o = {
a:10,
b:{
// a:12,
fn:function(){
console.log(this.a); //undefined
}
}
}
o.b.fn();

此时的this.a是undefined,原因是:尽管fn被最外层的o对象所调用,但是this指向的只是当前fn的上一级的对象,也就是b对象,b对象没有a属性,所以输出undefined。

再看另外一种比较特殊的this指向情况:

var o = {
a:10,
b:{
a:12,
fn:function(){
console.log(this.a); //undefined
console.log(this); //window
}
}
}
var j = o.b.fn;
j();

这个比较好理解:this指向的永远是最后调用它的对象,也就是函数执行时候的对象,很明显通过对象j去执行fn函数,j的this指向是window,而全局没有a属性,所以输出是undefined。

3,构造函数的this执行

function Fn(){
this.user = "miya";
}
var a = new Fn();
console.log(a.user); //miya

此时Fn构造函数中this指向是a对象,因为new关键字改变了this指向,a是Fn的实例,为什么new关键字会改变this指向,因为new一个实例时候是先创建了一个空对象,然后将原对象或原对象原型上的方法或属性copy一份到新对象上。所以this指向改变到新对象上面。

再来看个例子:

function fn(){
this.name = 'miya';
return {name:'Jone'};
}
var a = new fn();
console.log(a.name);

觉着是不是应该返回miya,但实际返回的是Jone;

function fn(){
this.name1 = 'miya';
return function(){};
}
var a = new fn();
console.log(a.name1); //undefined

此时,a instanceof fn    //false;表示a不是fn的实例了。

ES6中的class类的constructor中也有类似的例子:

class Foo {
constructor() {
return Object.create(null);
}
} new Foo() instanceof Foo
// false

ES6的class相当于ES5中的构造器函数,constructor方法默认返回实例对象this,但是如果返回全新的对象,那么实例就不是原类的实例了。

如果构造函数返回的是一个对象,那么this指向就是那个返回对象,但如果不是对象,this指向还是构造函数的实例。

function fn(){
this.name1 = 'miya';
return null;
}
var a = new fn();
console.log(a.name1); //miya
a instanceof fn //true

照理说null也是对象,但是此时this指向还是构造函数的实例对象,因为null比较特殊。

所以代码中:beforefn.apply( this, arguments );//this指向就是当前的beforefn,因为是beforefn在执行,所以this当然是beforefn了。

【完】

究竟什么是真理?———不可驳倒的谬误便是。                   —尼采