我们先来看一道题。
var foo = 123;
function print(){
this.foo = 234;
console.log(foo);
}
//print()和new print()分别打印出什么
首先说说print()。print()打印的foo在AO里面并没有,所以要到GO里面去找,也就是window里面的foo,为123,而函数里面的this指向的是window,相当于把123改为234,最后打印出来,答案为234。
image.png
再说说new print()。print()打印的也是foo,但是这个时候的函数里面this有人了,即
var foo = 123;
function print(){
//var this = Object.create(print.prototype)
this.foo = 234;
console.log(foo);
}
此时this.foo = 234就是函数里面的对象里的东西了,但我们要访问的是foo,AO里面并没有foo,还得上GO里面找,找到的是123,从而打印出123。
new print()的结果
也就是说,当你new一个函数执行时,函数里面会生成一个新的对象
var this = {
__proto__:'函数名'.prototype
}
像刚才那题使用new print(),this指向新生成的对象,this.foo被放进了这个对象里面,所以你在函数AO里面找不到foo,只能往上一级去找,也就是window里的foo。