zoukankan      html  css  js  c++  java
  • 关于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)
  • 相关阅读:
    列表
    *
    Model/View
    文件
    提示用户输入并获得输入
    编码
    使用静态QT库编译的程序不显示中文
    rm命令
    高阶函数
    jquery checkbox 操作
  • 原文地址:https://www.cnblogs.com/songdongdong/p/6429517.html
Copyright © 2011-2022 走看看