- 这道题的经典之处在于它综合考察了面试者的JavaScript的综合能力
包含了变量定义提升
、- this指针指向、
- 运算符优先级、
- 原型、
- 继承、
- 全局变量污染、
- 对象属性及原型属性优先级等知识
// 创建了Foo函数
function Foo () {
// 为Foo函数创建了getName的静态属性存储了一个匿名函数
getName = function () {
console.log(1)
}
return this
}
// 为Foo的原型对象创建了一个叫getName的匿名函数
Foo.getName = function () {
console.log(2)
}
Foo.prototype.getName = function () {
console.log(3)
}
// 通过函数变量表达式创建了一个getName函数
var getName = function () {
console.log(4)
}
function getName () {
console.log(5)
}
// Foo.getName自然是访问Foo函数上存储的静态属性
Foo.getName() //2
getName() //4
Foo().getName() //1
getName() //1
new Foo.getName() //2
new new Foo().getName() //3
第一问Foo.getName()
function User (name) {
var name = name //私有属性
this.name = name //公有属性
function getName () { //私有方法
return name
}
}
User.prototype.getName = function () {//公有方法
return this.name
}
User.name = 'zwz' //静态属性
User.getName = function () { //静态方法
return this.name
}
var zz = new User('zwz') //实例化
调用公有属性,公有方法,我们必须先实例化对象,也据说new操作符实例化对象,就可构造实例化对象的方法和属性,并且公有方法是不能调用私有方法和静态方法的
静态方法和静态属性就是我们无需实例化就可以调用的
而对象的私有方法和属性,外部是不可以访问的
第二问getName()
直接调用getName(),既然是直接调用那么就是访问当前上下文作用域内的叫getName() 的函数,和123没用关系
// 函数声明
function zwz (type) {
return type === 'zwz'
}
// 函数表达式
var zwz = function (type) {
return type === 'zwz'
}
var getName //undefined
getName() //TypeError:getName is not a function
var getName = function () {
console.log(zwz)
}
var getName //undefined
getName()
function getName() {
console.log(zwz)
}
函数声明和函数表达式是存在区别的,函数声明在JS解析时进行函数提升,因此在同一个作用域内,不管函数声明定义在哪里,该函数都可以调用而函数表达式的值是在JS运行时确定的,并且在表达式完成赋值后,该函数才能调用。所所以4覆盖了5