继续最后一篇文章,如何编写高质量的JS代码这一次将Javascript函数知识点整理出来。

2。使用功能

该函数为程序员提供主要的抽象函数,并提供实现机制,函数可以独立地实现其他语言中的许多特性,如进程、方法、构造函数、甚至类或模块。

2.1了解函数调用、方法调用和构造函数调用之间的区别。

对于面向对象编程,函数、方法和类的构造函数是三个不同的概念。

使用模式:

1、函数调用

复制代码代码如下所示:

函数hello(用户名){

返回hello+用户名;

}



2、方法调用

复制代码代码如下所示:

var obj = { {

你好:函数(){

回到你好,+ this.username;

},

用户名:floralam

};

Ohj.hello(你好,floralam); / /



这个变量绑定到对象因为喂的方法是在目标对象的定义。我们也可以得到它。另一个对象被分配相同的函数引用,得到相同的答案。

复制代码代码如下所示:

var obj2 = { {

你好:obj.hello(),

用户名:floralam

};





3,构造函数使用

复制代码代码如下所示:

功能的用户(姓名、passwordhash){

this.name =名称;

this.passwordhash = passwordhash;

}



使用新操作符调用用户被认为是构造函数。

复制代码代码如下所示:

VaR U =新用户(floralam



与函数调用和方法调用不同,构造函数将一个新对象作为这个变量的值调用,并且隐式地将新对象作为调用的结果返回。构造函数的主要职责是初始化新对象。

2.2掌握高阶函数

高阶函数比那些充当函数的参数或返回值的函数,将函数作为参数(通常称为回调函数),因为高阶函数然后调用它)是一种特别强大和富有表现力的语言,也广泛应用于js程序中。

考虑到数组的标准排序方法,为了为所有数组工作,排序方法要求调用者确定如何比较数组中的任意两个元素。

复制代码代码如下所示:

功能comparenumber(x,y){

如果(x y){

返回- 1;

}

如果(x = y){

返回1;

}

返回0;

}

{ 3,1,4,1,5,9 }。排序(comparenumbers); / / { 1,1,3,4,5,9 }



复制代码代码如下所示:

{ 3,1,4,1,5,9 }。排序(函数(x,y){

如果(x y){

返回- 1;

}

如果(x = y){

返回1;

}

返回0;

}); / / { 1,1,3,4,5,9 }



通过匿名函数进一步简化了上述示例。

学习使用高阶函数通常简化代码并消除冗长的示例代码:

复制代码代码如下所示:

弗莱德

var = { };

对于(var i = 0,n = names.length;i < n;i++){

上{我} =名字{我} toUpperCase();

}

上方;弗莱德



使用数组方便的映射方法,可以消除循环,并且只有一个局部函数可用于将元素逐一转换。

复制代码代码如下所示:

弗莱德

var上= names.map(功能(name){)

返回name.touppercase();

});

上方;弗莱德



此外,例如,我们希望创建几种方法来创建不同的字符串,并具有通用的实现逻辑。每个循环通过连接每个独立部分的计算结果创建一个字符串。

复制代码代码如下所示:

功能bulidstring(n,回调){

var结果;

对于(var i = 0;i <;n;i + +){

结果=回调(i);

}

返回结果;

}

VaR字母= bulidstring(26,功能(我){ {)

返回String.fromCharCode(指标+我);

});

字母表; / / abcdefghijklmnopqrxtuvwxyz;

VaR位数= buildstring(10,功能(我){ return我;})

数字 0123456789

无功随机= buildstring(9,函数()){

随机= string.fromcharcode(math.floor(数学。随机)* 26(+指数)

});

随机; / / yefjmcef (随机)



这样可以让读者更清楚地了解代码在没有进一步细节的情况下能做什么。

评论

Javascript返回指定范围的随机数的公式(M-N):Math.random()*(n-m)+ M

同时,要注意标题的要求,是否返回正整数。

2.3调用模式

调用函数将暂停当前函数的执行,将控制和参数传递给新函数。除了声明时定义的形参外,每个函数都会收到两个新的附加参数:这个和参数。

这是一个非常重要的参数,它的值由调用模式决定。

以下是Javascript中的4种重要调用模式:

方法调用模式-方法调用模式

b.函数调用模式函数调用模式

C.构造函数调用模式构造函数调用模式

应用调用模式应用调用模式

这些模式在如何初始化这个关键参数上有所不同。

1。方法调用模式-方法调用方法

当函数被用作对象的方法时,我们将函数称为方法,当调用一个方法时,这个函数绑定到被调用对象。

复制代码代码如下所示:

VaR myobj时= {

瓦迩:0,

增量:函数(公司){

这类型的公司。瓦尔+ = =数的公司:1;

},

get_val:函数(){退货。瓦尔;}

}

myobj.increment(1); / /

增量myobj时{ }(2); / / 3



总结:

1。通过这种方法获取它们所属对象的上下文的方法称为公共方法。

2。当使用或下标表达式使用函数时,它是方法调用模式,并且该对象绑定到以前的对象。

3,函数可以使用这个来访问对象,因此它可以检索对象的值或改变对象的值。

2。函数调用模式函数调用模式

当一个函数不是一个对象的属性时,它被称为一个函数,当一个函数被调用为函数调用模式时,它被绑定到全局对象,这是Javascript设计的错误并继续。

复制代码代码如下所示:

函数添加(x,y){

返回x y;

}

MyObj。双=函数(){

var =;

var函数(){

那。瓦尔=加(that.value,,值);

这怎么可能/错了,为什么错了因为当函数被称为内部函数时,这个函数被绑定到了错误的对象,而全局对象没有K属性,所以它返回不正确的值。

/ / this.val =这。瓦尔+ this.val;

}

助手();

}

MyObj.double(); / / 6



三.构造函数调用模式构造函数调用模式

Javascript是一种基于原型继承的语言,这意味着对象可以直接继承其他对象的属性,并且该语言是未分类的。

如果在函数前面调用一个新的函数,那么将得到隐藏在函数原型成员中的一个新对象,这个对象也将绑定到新对象。

新前缀也会改变返回语句的行为,这不是推荐的编程方法。

复制代码代码如下所示:

函数(状态){

this.status =地位;

}

foo.prototype.get_status =函数(){

返回this.status;

}

要构造一个实例。

无功myfoo =新foo(条);

(myfoo。get_status); / / 吧



4。应用调用模式应用调用模式

因为Javascript是一种面向功能的语言,所以函数可以有一种方法。

应用程序方法有两个参数。第一个是将值绑定到这个,第二个是参数数组,也就是说,应用程序方法让我们构建一个数组并使用它来调用函数,也就是说,允许我们选择这个值,或者允许我们选择数组的值。

复制代码代码如下所示:

var数组;

VaR和= add.apply(null,阵列); / / 7

无功statusobj = {状态:ABCDEFG};

foo.prototype.pro_get_status =功能(前缀){

返回前缀+-+ this.status;

}

无功状态= foo.prototype.get_status.apply(statusobj); / / 的意思

无功pro_status = foo.prototype.get_status.apply(statusobj,{前缀}); / /前缀- ABCDEFG



通常,一个函数或方法的接收器(水平绑定到值的一个特别关键的这个)的调用语法确定。特别是,方法调用语法结合查找对象到这个变量。但是,有时候你需要使用自定义接收器调用函数。这个时候你需要使用调用方法或绑定方法自定义接收器调用方法

2.4用结合法提取受体的测定方法

由于该方法的属性和值作为函数没有差别,因此很容易提取对象的方法,并将函数作为回调函数直接提取到高阶函数中。

但是很容易忘记,提取的函数绑定到函数提取的对象。

复制代码代码如下所示:

var缓冲区= {

条目:{ },

添加:函数{

This.entries.push(S);

}

}

var源代码867

Source.forEach(黄油。添加); / /错误:条目是不确定的



在这个时候,对butter.add接收器没有黄油的对象。一个功能的接收机,取决于它是如何调用。foreach方法在全球范围内调用。因此,对foreach方法实现使用全局对象作为默认的接收器,因为条目属性不在全局对象,所以代码抛出一个错误。

foreach方法允许调用者提供一个可选的参数作为回调函数接收。

复制代码代码如下所示:

var源代码867

Source.forEach(butter.add,黄油);



但并不是所有的高阶函数都细心周到,为用户提供回调函数的接收器。

有两种解决方案:

1)通过创建一个显式的缓冲区对象方法调用Add的封装函数。不管封装函数是如何调用的,它总是确保将其参数推入目标数组中。

复制代码代码如下所示:

var源代码867

Source.forEach(function(){)

butter.add(S);

});



2)函数对象的绑定方法需要一个接收者对象,并通过接收者对象的方法调用产生一个包装函数来调用原始函数。

复制代码代码如下所示:

var源代码867

Source.forEach(butter.add.bind(缓冲区));



评论

Buffer.add.bind(缓冲区)创建一个新的功能,而不是修改buffer.add功能:

buffer.add = buffer.add.bind(缓冲区); / /假

以上是本文的全部内容,希望大家能喜欢。