关于JavaScript的一些笔试题

1.原题:

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

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

下面是我个人的分析:(先进行变量和函数的提升,在进行分析)

 1  function Foo(){
 2             getName = function(){//这里是函数表达式,但是没有使用var,执行的时候,会现在当前作用域查找有没有getName,如果有就返回,如果没有就想上找,直到直到全局作用域下,本例中,当前作用域没有,但是全局作用域中有var getName的声明,并且还有赋值,这个时候,会被他覆盖掉,变成getName = function(){console.log(1)};也就是覆盖了下面的getName = function(){console.log(4)};
 3                 console.log(1);
 4             }
 5             return this;
 6             }
 7       
 8         var getName;
 9         // Foo().getName();
10         function getName(){console.log(5)};//函数声明,在函数提升的时候会把整个函数体提升
11         Foo.getName = function(){console.log(2)};//给Foo中创建了一个getName的属性,并赋值了一个匿名函数
12         Foo.prototype.getName=function(){console.log(3)};
13         getName = function(){console.log(4)};//这里是赋值操作,会覆盖40行的函数声明
14 
15         Foo.getName();//2//访问Foo中的静态属性getName,也就是上面的赋值的匿名函数,所以输出的2
16         getName();//4因为45的赋值操作覆盖了42行的函数声明,顾输出的是4
17         Foo().getName();//1这里是这样操作的(Foo()).getName();我们可以看出Foo()属于window调用,this指向的就是window,
        他返回的this就是window,所以这里就相当于window.getName();window调用的时候会在当前作用域下找有没有getName,如果有就执行,
        这里全局环境的的赋值也就是getName = function(){console.log(4)};但是他已经被Foo中的getName覆盖了,变成了getName = function(){console.log(1)};
        所以这里输出的就是1;(注意这些覆盖是发生在调用的时候);;这里涉及this的问题
18 getName();//1、、由于上面的操作,getName = function(){console.log(4)};已经被覆盖成了getName = function(){console.log(1)};
            所以这里再直接访问getName()的时候,已经变了1
19 new Foo.getName();//2这里涉及的时候运算符的优先级,点的优先级高于new的优先级。所以先执行Foo.getName的操作,那就是输出2 20 new Foo().getName();//3这里也是优先级的问题,小括号的优先级最高,所以是(new Foo()).getName();那么就是先实例一个Foo的对象,然后去调用实例方法getName();
      根据属性搜索原则,先去构造函数中找,没有就上原型中去找,这里构造函数Foo中没有,但是原型中已经添加了getName = function(){console.log(3)};所以这里输出的是3
21 new new Foo().getName();//3//还是优先级的问题,应该是new ((new Foo()).getName)();先实例化Foo,在将Foo原型中的getName当成构造函数,
                    继续实例化,然后调用
22 // 这里我们写一个小demo 23 function fn(){ 24 setName = function(){console.log(1)}; 25 } 26 fn.prototype.setName= function(){console.log(2)}; 27 // new new fn().setName(); 28 // console.log(new((new fn()).setName)()); 29 new((new fn()).setName)();

 

2.获取100 - 1000之内的左右水仙花数

 1 var daffodil = () => {
 2   var temp = []
 3   var x,y,z,sum
 4   for (var i = 100; i < 1000; i++) {
 5     x = parseInt(i / 100)
 6     y = parseInt(i % 100 / 10)
 7     z = parseInt(i % 100 % 10)
 8     sum = Math.pow(x, 3) + Math.pow(y, 3) + Math.pow(z, 3)
 9     if (i == sum) {
10       temp.push(i)
11     }
12   }
13   return temp
14 }
15 
16 var x = daffodil()
17 console.log(x)

 

posted @ 2017-02-22 16:20  豆浆油条123  阅读(242)  评论(0编辑  收藏  举报