学习过程中不明确

2018-10-01  本文已影响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 实例是一个活的对象,任何对于样式的修改,会实时反映到这个实例上面。另外,这个实例是只读的
上一篇下一篇

猜你喜欢

热点阅读