Skip to content

函数调用问题(面试题)

js

function Foo() {
    getName = function () { console.log (1) } // 改变了全局作用域的getName
    return this // l
}
Foo.getName = function () { console.log (2)} // 静态方法
Foo.prototype.getName = function () { console.log (3)} // 原型方法
var getName = function () { console.log (4)} // 函数表达式,存在变量提升(var getName),执行到这里的时候会覆盖下面的那个函数【函数表达式覆盖函数声明】
function getName() { console.log (5)} // 函数声明,一等公民,无论在ES6还是在ES5环境都会提升到顶部【ES6是块级作用域顶部】
 
//请写出以下输出结果:
Foo.getName() // 2【普通调用】
getName() // 4【函数表达式覆盖函数声明】
Foo().getName() // 1【Foo()执行后,改变了全局作用域的getName,因此打印1】
getName() // 1【调用全局作用域的getName(),打印1】
new Foo.getName() // 2 相当于:new (Foo.getName)() 【原因: 点的优先级18比new无参数列表17要高】【new 后面跟的函数没加括号就是无参数列表,也叫无参数new,函数还是会执行】
new Foo().getName() // 3 相当于:(new Foo()).getName()【原因:new后面跟的函数有括号,是有参数列表且优先级同点的优先级,遵循从左至右解析。new出一个实例对象,然后取原型的方法getName,打印3】
new new Foo().getName() // 3 相当于:new ((new Foo()).getName)()

``