第十三天
bind()方法是ES5方法,但可在ES3中模仿。作用为将莫格函数绑定至某个对象。
// 返回一个函数,通过调用它来调用o中的方法f(),传递它的所有实参。
function bind(f,o){
if(f.bind) return f.bind(o); //如果bind()方法存在的话,使用bind()方法
else return function(){ //否则,这样绑定
return f.apply(o,arguments);
};
}
关于Function()构造函数并不需要通过传入实参以指定函数名。就像函数直接量一样,Function()构造创建一个匿名函数
关于Function()构造函数有几点需要注意:
- Function()构造函数运行JavaScript在运行时动态地创建并编译函数。
- 每次调用Function()构造函数都会解析函数体,并创建新的函数对象。如果是在一个循环或者多次调用的函数中执行这个构造函数,执行效率会受影响。相比之下,循环中的嵌套函数和函数定义表达式则不会每次执行时都重新编译
- 最后一点,也是关于Function()构造函数非常重要的一点,就是它所创建的
- 函数并不是使用词法使用域,相反,函数体代码的编译总是会在顶层函数李执行,正如下面代码所示:
var scope = “global”;
function constructFunction(){
var scope = “local”;
return new Function(“return scope”); //无法捕捉局部作用域
}
//这一行代码返回的是global,因为通过Function()构造函数
//所返回的函数使用的不是局部作用域
constructFunction()();//=>”global”
map方法
//对于每个数组元素调用函数f(),并返回一个结果数组
//如果Array.prototype.map定义了的话,就使用这个方法
var map = Array.prototype.map
?function(a,f){ return a.map(f);} //如果已经存在map()方法,就直接使用它
:function(a,f){
var results = [];
for(var i = 0,len =a.length; i < len; i++){
if(i in a) results[i] =f.call(null,a[i],I,a);
}
return results;
};
//使用函数f()和可选的初始值将数组a减至一个值
//如果Array.prototype.reduce存在的话,就使用这个方法
var reduce = Array.prototype.reduce;
?function(a,f,initial){ //如果reduce()方法存在的话
if(arguments.length > 2)
return a.reduce(f,initial); //如果传入了一个初始值
else return a.reduce(f); // 否则没有初始值
}
:function(a,f,initial){//这个算法来自ES5规范
var i = 0,len = a.length,accumulator;
// 以特定的初始值开始,否则第一个取自a
if(arguments.length > 2) accumulator = initial;
else{ //找到数组中第一个已定义的索引
if(len == 0) throw TypeError();
while(i < len)
if( i in a){
accumulator = a[i++];
break;
}
else i++;
}
if(i == len) throw TypeError();
}
// 对于数组中剩下的元素一次调用f()
while(i < len){
if(i in a)
accumulator = f.call(undefined,accumulator,a[i],i,a);
i++;
}
return accumulator;
};