闭包面试题
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 10 function Foo() {//函数定义 没调用不管 11 getName = function () { alert (1); }; //这个定义了一个全局函数getName,覆盖了var getName = function () { alert (4);}; 12 return this; 13 } 14 Foo.getName = function () { alert (2);};//相当于往函数对象内部添加了一个属性 15 16 Foo.prototype.getName = function () { alert (3);};//foo函数的显式原型对象 这是给实例化对象用的 17 18 function getName() { alert (5);} 19 20 var getName = function () { alert (4);};// 覆盖上边 21 //请写出以下输出结果: 22 Foo.getName();//2 调用函数对象上的方法 23 24 getName();//4 发生了覆盖 所以输出后边的值 25 26 // 首先foo作为一般函数执行 因为自身没有getName 所以修改外部(window)的getName 27 // 返回this 这个时候this的指向是全局 所以相当于 window.getName(); 28 Foo().getName();//1 29 getName();//1 30 new Foo.getName();//2 当做构造函数使用 最终执行结果 31 32 // new foo()先看成一个整体去执行 生成实例化对象 实例化对象的方法就是原型里的方法 33 new Foo().getName();//3 34 new new Foo().getName();//3 35 // 但是不会报错 会先把前边的那个new暂时舍弃 36 // 把第二个new foo() 当做构造函数调用 返回实例化对象 37 // 实例化对象.getName() 这个时候最前边的new就可以执行了 38 // 把这个整体当做了 构造函数调用 new 实例化对象.getName() 只要返回值就可以了 39 </script> 40 </body> 41 </html>