美文网首页
es5疑难解析

es5疑难解析

作者: zxhnext | 来源:发表于2019-03-20 12:00 被阅读0次

    1.请写出弹出值,并解释为什么

    alert(a)
    a();
    var a=3; 
    function a(){
      alert(10) 
    }
    alert(a) 
    a=6; 
    a();
    // 上题实际执行为
    function a() {
        alert(10)
    }
    var a;
    alert(a); //==> //函数体
    a(); //=》执行这个函数
    a = 3;
    alert(a); //=> a=3
    a = 6;
    a(); //a不是一个函数
    
    //1.=======基本提升=====
    // test();
    // function test(){}
    // test();
    
    // if(false){
    //     var a  = 1;
    // }
    // alert(a);
    //2.======函数优先级别比变量高=======
    //3.词法作用域名当函数名和变量 忽略变量名
    

    2.请写出如下输出值,并写出把注释掉的代码取消注释的值

    this.a = 20;
    var test = {
      a: 40, 
      init:()=> {
        console.log(this.a); 
        function go() {
            // this.a = 60;
            console.log(this.a); 
        }
        go.prototype.a = 50;
        return go;  
        }
    };
    //var p = test.init();
    //p(); new(test.init())();
    
    this.a = 20;
    p = {
      a:30,
      test: function() {
        console.log(this.a)
       }
    };
    p.test(); // 30
    var s = p.test;
    s()  // 20
    
    this.a = 20;
    var p = {
      a:30,
      test: function() {
        // console.log(this.a)
        this.a = 40
        function s() {
            this.a = 60;
            console.log(this.a)
         }
        return s;
      }
    };
    (p.test())()        
    
    //1.谁调用函数 this就指向谁
    //2.init没宿主环境 window
    //3.=> 绑定她爹的运行环境
    //4.在类上的this 先绑定构造函数里的this
    

    3.写出输出值,并解释为什么

    function test(m) {
      m = {v:5} 
    }
    var m = {k: 30}; 
    test(m); 
    alert(m.v); // undefined 重写了 如果将m={v:5}改为m.v=5,则可以打出5
    

    4. 用es5实现一个let

    let a = 1;
    try{
        throw 1;
     }catch(a){
        console.log(a);
    }
    
    (function (){
       var a = 1;
    })();
    
    {
      let a = 1;
    }
    console.log(a);
    

    5. 请写出代码执行结果

    参见第8题

    function yideng() {
      console.log(1); 
    }
    (function () { 
      if (false) {
        function yideng() { 
           console.log(2);
        } 
      }
      yideng(); 
    })();
    

    6. 请用一句话遍历变量a

    Array.prototype.map.call(a,function(e){console.log(e)})
    // es6方法
    Array.form("abc")
    [..."abc"]
    [Symbol.iterator]
    Reflext.set // 反射
    

    7. 写出如下代码执行结果

    var length = 10;
    function fn() {
      console.log(this.length);
    }
    var yideng = { 
      length: 5,
      method: function (fn) { 
        fn();
        arguments[0](); 
      }
    };
    yideng.method(fn, 1); // 10 2
    

    8. 请写出输出值

    alert(a);
    yideng();
    var flag = true;
    if(!flag){
      var a = 1;
    }
    if (flag) {
      function yideng() {
        console.log("yideng1");
      }
    } else {
      function yideng() {
        console.log("yideng2"); 
      }
    }
    // undefined
    // yideng is not a function
    
    function yideng() {
        console.log(1);
    }
    (function () {
        if (false) {
            function yideng() {
                console.log(2);
            }
        }
        yideng(); // yideng not a function
    })();
    
    // 因为函数名被提出来了,真实运行效果如下,所以会报不是一个函数
    function yideng() {
        console.log(1);
    }
    (function () {
        var yideng; // function yideng(){} 简化为var yideng;
        if (false) {
            function yideng() {
                console.log(2);
            }
        }
        yideng(); // yideng not a function
    })();
    

    9. 变量a会被GC回收么,为什么

    function test(){
      var a = "yideng"; 
      return function(){
        eval(""); 
      }
    }
    test()();
    

    10. 写出输出值

    Object.prototype.a = 'a'; 
    Function.prototype.a = 'a1';
    function Person(){};
    var yideng = new Person(); 
    console.log('p.a: '+ yideng.a);  // a
    console.log(1..a);  // a
    console.log(1.a); // 报错
    

    11. 请写出你了解的ES6元编程

    12. 请按照下方要求作答

    const timeout = ms =>
      new Promise((resolve, reject) => { 
        setTimeout(() => {
          resolve(); 
        }, ms);
      });
    const ajax1 = () =>
      timeout(2000).then(() => { 
        console.log("1");
        return 1; 
      });
    const ajax2 = () => 
      timeout(1000).then(() => {
        console.log("2");
        return 2; 
      });
    const ajax3 = () => 
      timeout(2000).then(() => {
        console.log("3");
        return 3; 
      });
    const mergePromise = (ajaxArray) =>{ 
      //1,2,3 done [1,2,3] //【代码书写处】
    }
    mergePromise([ajax1, ajax2, ajax3]).then(data => { 
      console.log("done");
      console.log(data); // data 为 [1, 2, 3]
    });
    // 执行结果为: 1 2 3 done [1,2,3]
    

    13. 请写出如下输出值,并解释为什么

    var s = [];
    var arr = s;
    for (var i = 0; i < 3; i++) {
      var pusher = { 
        value: "item"+i
      },
      tmp;
      if (i !== 2) {
        tmp = []
        pusher.children = tmp
      }
      arr.push(pusher);
      arr = tmp; 
    }
    console.log(s[0]);
    

    14. 变态题

    function fun(n, o) {
      console.log(o);
      return {
        fun: function(m) {
          return fun(m, n)
        }
      }
    }
    var a = fun(0);
    a.fun(1); a.fun(2);
    var b = fun(0).fun(1).fun(2).fun(3);
    var c = fun(0).fun(1);
    c.fun(2); c.fun(3);
    

    15. 手动实现一个bind函数

    Function.prototype.myBind = function(thisArg) {
      if (typeof this !== 'function') {
        return
      }
      var _self = this
      var args = Array.prototype.slice.call(arguments, 1)
      var fnNop = function () {} // 定义一个空函数
      var fnBound = function () {
        var _this = this instanceof _self ? this : thisArg
    
        return _self.apply(_this, args.concat(Array.prototype.slice.call(arguments)))
      }
      // 维护原型关系
      if (this.prototype) {
        fnNop.prototype = this.prototype;
      }
    
      fnBound.prototype = new fnNop();
    
      return fnBound;
    }
    

    16. 手写promise

    参考:http://www.cnblogs.com/huansky/p/6064402.html

    17. 数组去重

    1. set
    2. 利用对象
    3. 建新数组,与相邻的比较
      参考:https://www.jb51.net/article/121410.htm

    18、 手写一个代理

    参考:https://www.jianshu.com/p/73b7b8e2b2d2

    19、array与[ ]区别

    除了在需要实例化一个对象,或罕见的需要延时加载数据的情况外,你基本上不需要使用new关键字。在Javascript里分配大量的new变量地址是一项很慢的操作,为了效率起见,你应该始终使用对象符号。

    很简单,Array()是一个对象,[]是一个数据原型。使用new Array()系统每次都会新生成一个对象(浏览器每生成一个对象都会耗费资源去构造他的属性和方法),他的子集是[];

    个人推荐使用[],效率高。浏览器对于CPU很吃紧,所以很多时候要有技巧。比如数字转换成字符只要a=a+'';就可以了,比用String效率高了很多。但是如果乱用是会造成错误的。

    20、退出死循环

    while(true){
      throw new console.error(123)
    }
    

    相关文章

      网友评论

          本文标题:es5疑难解析

          本文链接:https://www.haomeiwen.com/subject/igxzmqtx.html