先把面试题贴出来:
//请回复下面函数顺次实行出什么;
function Foo () {
bar = function () {
console.log(1)
}
return this;
}
Foo.bar = function () {
console.log(2)
}
Foo.prototype.bar = function () {
console.log(3)
}
var bar = function () {
console.log(4)
}
function bar () {
console.log(5)
}
Foo.bar();//2
bar();//4
Foo().bar();//1
bar();//1
new Foo.bar();//3
new Foo().bar();//3
new new Foo().bar();//3
刚看到这个题目,实在有点晕;不过细细剖析下来,照样有点门道的。
起首我们来看一下这道题考核的是什么
js的三种挪用形式
组织函数 原型
这里涉及到js的三种挪用形式;1.要领挪用 2.函数挪用 3.组织函数挪用
接下来,我们逐一剖析题目;
1. Foo.bar();//2
因为浏览器在实行js时是同步去实行的,这里能够将Foo.bar
看作 a
;这时候就相当于:
a = function () {
console.log(2)
}//因为不是严厉形式,这里省略了声明函数的关键字 var;
a();//2
2. bar();// 4
这个实行响应的函数体:
var bar = function () {
console.log(4)
}
3. Foo().bar();// 1
Foo()
会去实行function Foo(){};同时会返回出一个全局的this;Foo().bar()
实行函数Foo体内的bar函数
4. bar();// 1
第一个题目bar()实行的是函数:
var bar = function () {
console.log(4);
}//打印出来的是4
而在实行Foo().bar()时,Foo()会返回出来全局this,this内部的bar函数为:
bar = function () {
console.log(1)
}
此时会掩盖其他的bar函数
5. new Foo.bar();// 2
组织函数挪用形式;
Foo.bar = function () {
console.log(2)
}
var foo =new Foo.bar(); //把Foo.bar看作为团体如newFoo(){},newFoo就变成了组织函数
var foo = new newFoo();// foo => 2
6. new Foo().bar();// 3
运用new关键字,便会建立一个对象, 依据prototype属性建立原型链,并以该对象为this实行指定的(组织)函数。
我们把须要的函数拿出来,看起来会爽的多;
function Foo () {
bar = function () {
console.log(1)
}
return this;
}
Foo.prototype.bar = function () {
console.log(3)
}
var foo = new Foo();
foo.bar() //3
看到这里是否是就很清楚了;简朴的组织函数加原型的继续;
7. new new Foo().bar();// 3
连系上面两问;该题目能够如许写;
new new Foo().bar() => new foo.bar() =>new newFoo()//回到了用组织函数挪用的形式;