一道JS面试题

来源:互联网 发布:微信站街软件免费下载 编辑:程序博客网 时间:2024/04/29 20:55

摘自微信公众号

        function Foo() {                getName = function() { //这里没var,因此改变的全局变量上的属性!!!                    alert(1);                };                return this;            }            Foo.getName = function() {                alert(2);            };            Foo.prototype.getName = function() {                console.log(this);                this.aa = '123';                alert(3);            };            var getName = function() {                alert(4);            };            function getName() {  //函数声明会被提前,会被var操作覆盖掉                alert(5);            }            //请写出以下输出结果:            Foo.getName();  //2            getName();      //4            Foo().getName(); //1            getName(); //1            new Foo.getName();  //2            new Foo().getName(); //3            new new Foo().getName();  //3  

下面一一解释下(个人浅显的理解…)
1. 调用的是Foo函数对象上的getName函数。输出2
2. 全局作用域下的getName,相当于window.getName()。如何判断时输出4而不是5呢?两个都是定义了相同名称的getName,而且function关键字定义的函数还是后面才定义的,应该是覆盖了var定义的函数才对啊?,在JS中,函数的声明和定义将会被提前,也就是说,我可以先使用这个函数,后面才去定义,JS在执行时,将会把doSth()的定义提前,我们才得以引用函数。变量就不会。因此后面的var关键字定义将提前的function定义给重置了。
3. 这里粗心的话,很容易得出alert(4)的结论,仔细一看,Foo函数中定义的getName没有var,因此时一个全局变量,改变了全局的getName,因此输出1
4. 同上,被修改了全局的getName
5. 和第一个一样,new的是Foo函数对象上的getName函数
6. 先new Foo(),然后getName(),因此调用的时原型链上的getName
7. 先new Foo(),然后new Foo对象上的getName,就是new Foo.prototype.getName()

0 0
原创粉丝点击