0

结果指向window,为啥啊,这不是个闭包吗?

查看全部 12 个回答

1

其实你这个问题,等于是在问,js中 new 的操作原理到底是啥?,或者说new 调用和函数普通调用有啥区别http://blog.vjeux.com/2011/javascript/how-prototypal-inheritance-really-works.html 看完这篇文章你就理解啦。

补充,针对你的问题,先抛出结论:

  • 构造函数在不返回值的情况下,默认返回新对象实例
  • 如果函数返回值为常规意义上的数值类型(Number、String、Boolean)时,new函数将会返回一个该函数的实例对象,而如果函数返回一个引用类型(Object、Array、Function)时,则new函数与直接调用函数产生的结果相同。

根据《高程》这本书上的说明:构造函数本身也是函数,只不过可以用来创建对象而已,其与普通函数的唯一区别,就在于调用方式的不同。任何函数如果通过 new 操作符来调用,那么就可以作为构造函数,反之就是普通函数调用。

构造方式调用实际上会经历以下 4 个步骤:

  • (1)创建一个对象;
  • (2)设置原型链,或者叫绑定构造函数原型
  • (3)将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象),执行函数体
  • (4)判断返回值类型,并返回。如果是值类型,就丢弃它,还是返回 instance。
    如果是引用类型,就返回这个引用类型的对象,替换掉 instance。

注意:
1、若无返回值,即相当于返回 return undefined,undefined 是值类型的,因此丢弃它,返回 instance。正好对应上面结论第一条。

2、 如果return this相当于返回一个引用类型的对象,它自己就是instance,无所谓替换不替换了。

演示代码什么呢的,书上就有,或者自行模拟下。

下面回到问题:

F 返回的是引用类型的 C 函数,那么就替换掉以F new 调用出来的实例,那么自然就是普通的 C 函数调用 (而且是在全局环境中),自然 this 指向 window。

new 的出现,我个人认为是 JS 语言在演进中为了向传统 OO 语言看齐,模拟 class,完成工厂模式,或者说是一种 “糖”,减轻重复劳动。 当然,我也是 YY 的。以上内容也是网上和书上总结搬运的,如若错误请指正,谢谢!

推荐答案

2

已采纳

javascript中的this指向与调用者有关,分为以下4种情况

  • 函数调用,即直接调用a(),这种this指向global对象,在浏览器即window,例如:
function a() {
    console.log(this)
}
a() //window
  • 方法调用,即作为对象的方法调用,此时指向对象本身,例如
var a = {
    b : function(){
        console.log(this)
    }
}
a.b() // a
  • 用new调用,此时返回new出的实例,例如
function A(){
    console.log(this)
}
var a = new A() // a
  • 用call,apply,bind调用,绑定到传入的参数对象,如
var a= function(){
    console.log(this)
}
var b = []
a.call(b) // []