js经典题讲解

     function Foo() {
            getName = function () {alert(1)  }
            return this
        }
        Foo.getName = function () {  alert(2)  }
        Foo.prototype.getName=function(){alert(3)}
        var getName = function(){alert(4)}
        function getName(){alert(5)}

        Foo.getName()   //(1)..2
        getName()       //(2)...4
        Foo().getName()    //(3)...1
        getName()  //(4)....1
        new Foo.getName()   //(5).....2
        new Foo().getName()    //(6)...3
        new new Foo().getName()  //(7)...3

(1)输出来的是2因为:
Foo.getName = function () { alert(2) }相当于是Foo的特权方法


(2)输出的是4因为:

  • 首先函数有两种方式
    函数声明:有变量提升,事先在内存中,所以不管在函数之前调用和函 数之 后调用都可以
    函数表达式:无变量提升,在定义的后面执行,如果在函数定义之前调用会报错
    所以说在调用Foo时系统会自动先执行function getName(){alert(5)}这句代码,然后才会去执行
    var getName = function(){alert(4)}这句代码,4会把5覆盖掉,所以输出的是4,
    变量的提升高于函数的提升

(3)输出的是1因为:
开始的Foo()输出的是window对象,所以说Foo().getName()执行的就是 var getName = function(){alert(4)}这行代码,在全局中寻找getName方法,由于Foo函数内部的 getName = function () {alert(1) }这行代码是全局的所以说1会覆盖掉4,输出的就是1。如果说Foo中的getName方法加上var就是一个局部函数不是全局的,这下会输出4


(4)输出的是1因为
在第三行的时候已经把4覆盖掉了,所以说输出的是1,


(5)输出的是2因为
在 new Foo.getName()是相当于在new (Foo.getName())这个整体,所以说会new Foo.getName = function () { alert(2) }这个函数。 所以会输出的2。

  • 函数在没return之前不加new会返回undefined,加new会返回当前的实例化对象

  • 普通函数的作用域是window,加new的作用域是当前对象,所以说返回值不同

  • 再使用new一个函数是中间会发生什么
    1.创建一个对象
    2.将构造函数的作用域给新对象,所以this指向的就是这个新对象
    3执行构造函数中的代码,为这个新对象添加属性
    4最后返回这个新对象

  • 普通函数不会创建新的对象,直接执行内部代码,this谁调用指向谁


(6)输出的是3因为
首先会在函数的内部找getName函数,结果没有,所以我们会在原型上面找,在原型上面有
Foo.prototype.getName=function(){alert(3)}这行代码,所以输出的是3


(7)输出的是3因为
相当于是在new ( new Foo().getName())这个整体,所以说他会找到
Foo.prototype.getName=function(){alert(3)}这行代码,会输出3

你可能感兴趣的:(js经典题讲解)