美文网首页
学习过程中不明确

学习过程中不明确

作者: 黑色的五叶草 | 来源:发表于2018-10-01 17:44 被阅读0次
    1. 斐波那契数列
    function fib(num) {
      if (num === 0) return 0;
      if (num === 1) return 1;
      return fib(num - 2) + fib(num - 1);
    }
    
    fib(6) // 8
    

    问题:num参数在fib函数的执行过程,为什么结果是8

    function myIsNaN(value) {
      return typeof value === 'number' && isNaN(value);
    }
    
    1. console对象
    ['log', 'info', 'warn', 'error'].forEach(function(method) {
      console[method] = console[method].bind(
        console,
        new Date().toISOString()
      );
    });
    
    console.log("出错了!");
    // 2014-05-18T09:00.000Z 出错了!
    
    1. forEach函数中内容不理解type['is' + t] = function (o) { }
    var type = function (o){
      var s = Object.prototype.toString.call(o);
      return s.match(/\[object (.*?)\]/)[1].toLowerCase();
    };
    
    ['Null',
     'Undefined',
     'Object',
     'Array',
     'String',
     'Number',
     'Boolean',
     'Function',
     'RegExp'
    ].forEach(function (t) {
      type['is' + t] = function (o) {
        return type(o) === t.toLowerCase();
      };
    });
    
    type.isObject({}) // true
    type.isNumber(NaN) // true
    type.isRegExp(/abc/) // true
    

    已理解索引t的含义

    [   
        'Null',
        'Undefined',
        'Object',
        'Array',
        'String',
        'Number',
        'Boolean',
        'Function',
        'RegExp'
    ].forEach(function (t) {
        console.log(t)
    });
    
    1. JSON.parse() 第二个参数作为回调函数递归
      不理解: b:4d产生的过程
    var o = {a: 1};
    
    function f(key, value) {
      if (typeof value === 'object') {
        return {b: 2};
      }
      return value * 2;
    }
    
    JSON.stringify(o, f)
    // "{"b": 4}"
    

    对象o一共会被f函数处理三次,最后那行是JSON.stringify的输出。第一次键名为空,键值是整个对象o;(进入if语句,返回b:2)第二次键名为b,键值是2;(对键值2 * 2得到b:4)第三次键名为b,键值为4。

    // []:[object Object]
    // [b]: 2
    // [b]: 4
    
    1. 模块的宽放大模式:不理解传入的参数
    如果一个模块很大,必须分成几个部分,或者一个模块需要继承另一个模块,这时就有必要采用“放大模式”(augmentation)。
    
    var module1 = (function (mod){
     mod.m3 = function () {
      //...
     };
     return mod;
    })(module1);
    上面的代码为module1模块添加了一个新方法m3(),然后返回新的module1模块。
    
    在浏览器环境中,模块的各个部分通常都是从网上获取的,有时无法知道哪个部分会先加载。
    如果采用上面的写法,第一个执行的部分有可能加载一个不存在空对象,这时就要采用"宽放大模式"(Loose augmentation)。
    
    var module1 = (function (mod) {
     //...
     return mod;
    })(window.module1 || {});
    与"放大模式"相比,“宽放大模式”就是“立即执行函数”的参数可以是空对象。
    
    1. 串行执行
      我们可以编写一个流程控制函数,让它来控制异步任务,一个任务完成以后,再执行另一个。这就叫串行执行。
            var items = [1, 2, 3, 4, 5, 6];
            var results = [];
    
            function async (arg, callback) {
                console.log('参数为 ' + arg + ' , 1秒后返回结果');
                setTimeout(function () {
                    callback(arg * 2);
                    console.log(2);
                }, 1000);
            }
    
            function final(value) {
                console.log('完成: ', value);
            }
    
            function series(item) {
                if (item) {
                    async (item, function (result) {
                        console.log(1);
                        results.push(result);
                        return series(items.shift());
                    });
                } else {
                    return final(results[results.length - 1]);
                }
            }
    
            series(items.shift());
    

    上面代码中,函数series就是串行函数,它会依次执行异步任务,所有任务都完成后,才会执行final函数。items数组保存每一个异步任务的参数,results数组保存每一个异步任务的运行结果。

    注意,上面的写法需要六秒,才能完成整个脚本。

    1. Element.tabIndex
    2. 计算出元素左上角相对于整张网页的坐标
    function getElementPosition(e) {
      var x = 0;
      var y = 0;
      while (e !== null)  {
        x += e.offsetLeft;
        y += e.offsetTop;
        e = e.offsetParent;
      }
      return {x: x, y: y};
    }
    
    1. CSSStyleDeclaration 实例是一个活的对象,任何对于样式的修改,会实时反映到这个实例上面。另外,这个实例是只读的

    相关文章

      网友评论

          本文标题:学习过程中不明确

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