JavaScript学习笔记第十三天

第十三天
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()构造函数有几点需要注意:

  1. Function()构造函数运行JavaScript在运行时动态地创建并编译函数。
  2. 每次调用Function()构造函数都会解析函数体,并创建新的函数对象。如果是在一个循环或者多次调用的函数中执行这个构造函数,执行效率会受影响。相比之下,循环中的嵌套函数和函数定义表达式则不会每次执行时都重新编译
  3. 最后一点,也是关于Function()构造函数非常重要的一点,就是它所创建的
  4. 函数并不是使用词法使用域,相反,函数体代码的编译总是会在顶层函数李执行,正如下面代码所示:
    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;
    };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值