- 斐波那契数列
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);
}
- console对象
['log', 'info', 'warn', 'error'].forEach(function(method) {
console[method] = console[method].bind(
console,
new Date().toISOString()
);
});
console.log("出错了!");
// 2014-05-18T09:00.000Z 出错了!
- 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)
});
- 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
- 模块的宽放大模式:不理解传入的参数
如果一个模块很大,必须分成几个部分,或者一个模块需要继承另一个模块,这时就有必要采用“放大模式”(augmentation)。
var module1 = (function (mod){
mod.m3 = function () {
//...
};
return mod;
})(module1);
上面的代码为module1模块添加了一个新方法m3(),然后返回新的module1模块。
在浏览器环境中,模块的各个部分通常都是从网上获取的,有时无法知道哪个部分会先加载。
如果采用上面的写法,第一个执行的部分有可能加载一个不存在空对象,这时就要采用"宽放大模式"(Loose augmentation)。
var module1 = (function (mod) {
//...
return mod;
})(window.module1 || {});
与"放大模式"相比,“宽放大模式”就是“立即执行函数”的参数可以是空对象。
- 串行执行
我们可以编写一个流程控制函数,让它来控制异步任务,一个任务完成以后,再执行另一个。这就叫串行执行。
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数组保存每一个异步任务的运行结果。
注意,上面的写法需要六秒,才能完成整个脚本。
Element.tabIndex
- 计算出元素左上角相对于整张网页的坐标
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};
}
- CSSStyleDeclaration 实例是一个活的对象,任何对于样式的修改,会实时反映到这个实例上面。另外,这个实例是只读的
网友评论