关于this的一个小问题?
高洛峰
高洛峰 2016-11-07 09:53:30
0
1
685

代码如下:

function foo() {
    console.log(this.a);
}
var a = 2;
var o = { a: 3, foo: foo };
var p = { a: 4 };
o.foo(); // 3

// 如果
(p.foo = o.foo)(); // 2

// 如果
p.foo = o.foo;
p.foo(); // 4

(p.foo = o.foo)(); 和 p.foo = o.foo; p.foo();这两个foo,执行结果为什么会不同,这两种写法有不一样吗?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

reply all(1)
三叔

建议楼主点击F12,直接console.dir()这两种情况的foo,在里面会找到一个叫constructor的东西。这个constructor,实际上就是this的指向。

对于第一个:

o.foo();

他的constructor指向o这个对象,因此this指向的是o,打印2;

第二个:

(p.foo = o.foo)();
//相当于
function f() {
    p.foo = o.foo;
}

f();

此时的constructor指向的其实是window,为什么呢?
因为constructor的初始化需要的是创建对象,因此o本身就是申明的对象,那么他的constructor就指向自己。
而调用f,这个f是在window下创建的(浏览器中所谓的全局环境其实就是window对象,你懂的),因此相当于调用了window.f(),那constructor自然指向window,而window中声明了a=2,那么用括号封闭立即执行的方法,都是通过window对象执行的(除非这整段函数封闭在另一个作用域中执行),自然this就指向window,从而this.a指向值为2的这个a。

第三个:

p.foo();//

函数由p执行,那么construtor指向的就是对象p,this也就指向p,因此this.a === p.a;//true。

PS:constructor是可写的,可以手动改变。

通过new操作符可以初始化一个constructor的指向,new的作用就是创建一个对象的实例,constructor也就指向了一个新的执行环境“在这个对象中”(百度“JS函数对象”)。


Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template