上述例子使用一个匿名函数进一步简化。 学会使用高阶函数通常可以简化代码并消除繁琐的样板代码。简单的转换字符串数组的操作我们可以使用循环这样实现: 复制代码 代码如下: var names = ["Fred","Wilma","Pebbles"]; var upper = []; for(var i = 0,n = names.length ;i< n;i++){ upper[i] = names[i].toUpperCase(); } upper;//["FRED","WILMA","PEBBLES"];
使用数组便利的map方法,可以消除循环,仅仅使用一个局部函数就可以对元素的逐个转换。 复制代码 代码如下: var names = ["Fred","Wilma","Pebbles"]; var upper = names.map(function(name){ return name.toUpperCase(); }); upper;//["FRED","WILMA","PEBBLES"];
另外,例如我们想创建若干个方法创建不同的字符串,具有共同的实现逻辑,每个循环通过连接每个独立部分的计算结果来创建一个字符串。 复制代码 代码如下: function bulidString(n,callback){ var result = ""; for(var i = 0 ; i < n ;i++){ result += callback(i); } return result; } var alphabet = bulidString(26,function(i){ return String.fromCharCode(aIndex + i); }); alphabet;//"abcdefghijklmnopqrxtuvwxyz"; var digits = buildString(10,function(i){ return i;}) digits;//"0123456789" var random = buildString(9,function(){ random += String.fromCharCode(Math.floor(Math.random()*26)+aIndex }); random;//"yefjmcef"(随机)
这样能够使得读者更清晰了解该代码能做什么,无须深入实现细节。 备注 javascript返回指定范围的随机数(m-n之间)的公式:Math.random()*(n-m)+m 同时要注意题目要求,是否要求返回正整数 2.3调用模式 调用一个函数将会暂停当前函数的执行,传递控制权与参数给新的函数。 除了声明时定义的形式参数,每个函数会接收到两个新的附加参数:this和arguments。 this是个很重要的参数,并且它的值是由调用模式决定的。 以下是JavaScript中很重要的4个调用模式: a. 方法调用模式the method invocation pattern b. 函数调用模式the function invocation pattern c. 构造器调用模式the constructor invocation pattern d. Apply调用模式the apply invocation pattern 这些模式在如何初始化关键参数this上存在差异 1. 方法调用模式the method invocation method 当函数作为对象的方法的时候,我们就叫函数为方法。当一个方法被调用的时候,this绑定到调用的对象。 复制代码 代码如下: var myObj={ val:0, increment:function(inc){ this.val+=typeof inc ==="number"? inc:1; }, get_val:function(){return this.val;} } myObj.increment();// 1 myObj["increment"](2);//3
小结: 1、通过this可取得它们所属对象的上下文的方法称为公共方法 2、当用 .或者下标表达式 来使用一个函数的时候,就是方法调用模式,this对象绑定到前面的对象。 3,一个函数可以使用this来访问对象,所以它能检索对象的值或者更改对象的值。绑定this到对象发生在调用的时候。 2. 函数调用模式the function invocation pattern 当一个函数不是一个对象的属性,那么它就是作为函数来调用的。当一个函数作为函数调用模式来调用的时候,this绑定到全局对象。这是JavaScript设计时的错误并延续了下来。 复制代码 代码如下: function add(x,y){ return x+y; } myObj.double=function(){ var that=this; var helper=function(){ that.val=add(that.value,that.value); //错误的写法可能是这样,为什么错呢?因为函数作为内部函数调用的时候,this已经绑定到了错误的对象,全局对象并没有val属性,所以返回不正确的值。 //this.val = this.val+this.val; } helper(); } myObj.double();//6