console.log(a) //undefined
var a = 1
console.log(a) //1
var a = function () {
console.log('a')
}
console.log(a) //f () {console.log('a')}
console.log(b) //undefined
var b = function () {
console.log('b')
}
console.log(b) //f () {console.log('a'
var b = 1
console.log(b) //1
同名函数提升:同名的函数声明,Javascript采用的是覆盖原则,先声明的会被覆盖,因为函数在声明时会指定函数的内容,所以同一作用域下一系列同名函数声明的最终结果是调用时函数的内容和最后一次函数声明相同。
a()//3
function a() {
console.log(1)
}
a()//3
function a() {
console.log(2)
}
a()//3
同名变量和函数提升:对于同名的函数声明和变量声明,采用的是忽略原则,由于在提升时函数声明会提升到变量声明之前,变量声明一定会被忽略,所以结果是函数声明有效。
//情况一
console.log(a) // f a() {console.log('a')}
var a = 1
console.log(a) // 1
function a() {
console.log('a')
}
console.log(a) // 1
//情况二
console.log(b) // f b() {console.log('b')}
var b = 1
console.log(b)// 1
function b() {
console.log('b')
}
console.log(b)// 1
第五题
new Foo.getName();//2
由知识点二可得此题执行顺序为new (Foo.getName)()
Foo.getName为function () { alert (2);};后将其作为构造函数执行,所以为2
第六题
new Foo().getName();//3
由知识点二可得此题执行顺序为(new Foo()).getName()
new Foo()此句为创建Foo对象,返回的this在构造函数中本来就代表当前实例化对象,由知识点三得,最终Foo函数返回实例化对象。
之后调用实例化对象的getName函数,因为在Foo构造函数中没有为实例化对象添加任何属性,之后到当前对象的原型对象(prototype)中寻找getName,故执行的为Foo.prototype.getName = function () { alert (3);};
注意: 构造函数内getName = function () { alert (1); };为赋值一个匿名函数给getName(看第三题),若想执行 alert (1); 构造函数内应为实例化对象添加属性,即this.getName = function () { alert (1); };
第七题
new new Foo().getName();//3
由知识点二可得此题执行顺序为new((new Foo()).getName)()
先初始化Foo的实例化对象,然后将其原型上的getName函数作为构造函数再次new。即Foo.prototype.getName = function () { alert (3);};作为构造函数,故为3