//请回答下面函数依次执行出什么; 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
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()执行的是函数:this
var bar = function () { console.log(4); }//打印出来的是4
而在执行Foo().bar()时,Foo()会返回出来全局this,this内部的bar函数为:prototype
bar = function () { console.log(1) }
此时会覆盖其他的bar函数code
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
咱们把须要的函数拿出来,看起来会爽的多;继承
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()//回到了用构造函数调用的模式;