变量是玩法

function Foo() { 
    getName = function () { console.log (1); }; 
    return this; 
} 
Foo.getName = function () { console.log (2);}; 
Foo.prototype.getName = function () { console.log (3);}; 
var getName = function () { console.log (4);}; 
function getName() { console.log (5);} 

//请写出以下输出结果: 
Foo.getName(); 
getName(); 
Foo().getName(); 
getName(); 
new Foo.getName(); 
new Foo().getName(); 
new new Foo().getName(); 
new Foo 
new Foo() 
new Foo().getName 
new new Foo().getName

第2,3,4个做错了,第2,4个想不明白!
老师,我是这样想的:
第一个题Foo.getName(); : 首先就声明了Foo是个函数,因为函数也是对象 可以Foo.getName()来调用,但是 Foo的属性getName,跟 function Foo(){}这个函数没关系,console.log(Foo)时,并没有包含它,Foo的实例 new Foo 也没有。它跟在Foo函数体里var 变量的相同点是都不会被实例继承,不同点理解不了。知道可以Foo.getName()来调用。
第二题getName(); :function Foo(){}这个函数里的getName 变量没有 var ,所以他是一个全局变量,也就是说在函数里面修改他,在函数外面它会同步。而且不调用Foo(),Foo里面的getName的肯定值执行不了。 当调用 getName(),首先会想到往下找到 这两个 var getName = function () { console.log (4);}; function getName() { console.log (5);} 。一个是函数类型的变量,一个是函数。两个的执行方法一样,但是getName函数是写在getName变量下面,应该调用 getName函数输出5。但并不是,所以想不通。他们类型不都是函数Function吗?
第三题Foo().getName(); :一般 只写getName()是默认window调用,这里getName()是被Foo()调用, 同样,Foo() 是被window调用。然而Foo()在题目中写的是 return this,因此Foo()返回的是this,也就是调用Foo()的window。我认为Foo().getName()等同于 window.getName()。 window对象里已经有了var getName = function () { console.log (4);}; 我就以为是输出4. 不过第一开始我是认为输出1,看到return this 才改变想法。
第4题getName(); : 和第2题想的一样。认为输出5。
第5题 new Foo.getName(); : 显然是实例化Foo里的getName 属性的值,实例的同时也调用了 Foo.getName();输出2
第6题 new Foo().getName();; :和第5题不同,的是他们实例化的对象不同, new 的是 foo(),并且调用的是Foo原型里的方法getName(),第五题相当于 new 的是Foo的getName,即 function () { console.log (2);}; 输出3
 第7题 new new Foo().getName(); : 我的想法是 new 的是第6题 ,new的同时也调用 ,所有输出3;

第8题 new Foo : new的是Foo 虽然没有加(),但是也和 new Foo()一样,new的同时也调用。然而,Foo这个函数里,本来没有执行任何输出。所有不输出
第九题 new Foo() : 认为和8题一样;期待老师给出他们的不一样
第十题 new Foo().getName :实例化new 了Foo(), getName是他原型里的 ,但 new Foo().getName 没有括号,就是没调用原型里的getName,所以不输出什么, 要是打印 new Foo().getName,会得到 function () { console.log (3);};
第是十一题 new new Foo().getName : 我是把它看做 new的是第十题 new Foo().getName ,即最终new的是function () { console.log (3);}, 因为new的同时会调用,所以调用原型里的getName函数 ,即function () { console.log (3);} 他和6题new new Foo().getName() 的区别是没加(),最终new好像不一样,; ;输出3。

原文地址:https://www.cnblogs.com/S-Ekin/p/6654081.html