1。函数的定义



函数包含一组语句,它们是Javascript的基本模块单元,用于代码重用、信息隐藏和组合调用。

2,函数的四种调用方式和初始化



第一:方法调用模式

下面的示例表明,当方法调用一个模式调用时,该对象绑定到拥有该方法的对象:

复制代码代码如下所示:

var

名称:语法

集名称:功能(name){

this.name =名称;

}

};

person.setname(zhangsan);

警报(人名);



第二:功能调用模式

下面的示例表明,当模式调用调用函数调用时,该对象绑定到全局对象:

复制代码代码如下所示:

VaR(value1,value2测试=添加);

变量名=语法;

var

名称:zhangsan / /名称定义的人

getName:函数(){

通过这个方法可以将这个函数的测试功能更改为这个对象的人

var =;

在定义 / /名称getName

变量名=丽丝;

var测试=函数(){()

通过访问该对象中的对象

这个指向全局对象的指针。

/ / this.name =语法

/ / that.name = zhangsan

警报({ this.name,,。名字});

};

(测试);调用模式

}

}

person.getname();



第三:构造函数调用模式

复制代码代码如下所示:

定义调用中的构造函数必须由新调用。

var =函数(名称){

this.name =名称;

}

对某人添加一个方法

person.prototype.getname =函数(){

返回this.name;

};

构建一个人对象

无功的人=新的人(zhangsan);

警报((人。getName)) / /调用getName;在个人价值得到对象的Name属性



第四种:应用调用模式

复制代码代码如下所示:



一 / /积累的方法。如SUM(1,2,3,4…)

此方法为窗口执行环境。

VaR DisplayName =函数(){()

警报(和执行环境:+类型(本));

警报(名称:+这个名称);在当前环境中删除当前执行的名称属性

}

设置一个人对象

var

名称:zhangsan

};

displayname.apply(人);





3、应用和调用之间的区别

复制代码代码如下所示:

设置一个包含Add、a和b返回的对象

var

添加:函数(a,b){

返回A+;

}

};

a、b和 /显示

功能showinfo(A,B){

警报(this.add(A,B));

}

/ / showinfo方法的变化运用方法这

/ / showinfo(1, 3); / /对象不支持的对象

showinfo.apply(人,{ 1, 3 });

showinfo.call(个人,1, 3);

可以从上面看到,应用程序和调用之间的差异适用于接受数组作为一个名为函数的参数,

调用是通过所有的参数将被调整为逗号分隔形式的函数。



4。函数参数(参数)

参数不是数组,但它就像一个数组。除了具有长度属性外,参数还没有数组的所有属性和方法。

复制代码代码如下所示:

函数和(){

var总= 0;

对于(var i = 0;i < arguments.length;i++){ / / arguments.length回报和呼叫转移的参数个数

总=参数{ };

}

总收益;

}

警报() +(1, 3, 2,4));



5。函数返回值(返回)

当一个函数被调用时,通常从开始到执行函数{ }结束。如果要提前结束函数,可以使用返回语句,此时,返回语句后面的所有语句将永远不会执行:

复制代码代码如下所示:

函数测试(){

警报();

返回;

警报();此语句永远不会执行。

}

测试();

函数总是返回一个值,如果不使用返回的返回值,默认的返回值是未定义的:

函数测试(){

警报();

}

警报((测试));输出:未定义

如果新使用函数调用,而返回值不是一个对象,则返回这个(新对象):

函数测试(){

警报();

}

var =新测试();

警报(typeof T); / /输出:对象

警报(T instanceof测试); / /输出:真



6,异常(例外)



异常是妨碍程序正常运行的一种异常事故(可能是人为故意的):

复制代码代码如下所示:

函数添加(a,b){定义加性函数

如果参数传递不是数字类型,则抛出异常。

如果(typeof =数的| |类型!B!=数){

把{

名字:TypeError / /属性自定义,可以任意取名字

消息:Add方法必须使用数字作为参数。

};

}

返回A+;

}

(函数(){())

异常捕获方法可以生成添加

尝试{

添加(10, );

} catch(e){

如果您想处理多个异常,那么通过一个catch语句,就可以通过异常的name属性来处理差异。

要确定异常的类型

如果(查询= TypeError){

警报(e.message);

}

}

});



7。向类型添加类型

允许Javascript将一个方法添加到基本类型中,例如:布尔、字符串、数字。

举例:在函数中添加一个方法函数,将函数添加到其他函数中(避免原型),然后使用方法函数向函数添加附加函数,最后在函数中实际添加测试函数,该方法将函数添加到函数中,以名称命名,然后返回函数的对象。

复制代码代码如下所示:

function.prototype.method =函数(名称、函数){

为了避免覆盖现有的 /

如果(!这个原型{ } }){

这个原型{ {函数};

}

返回此;

};

/ / function.method通过添加功能添加功能的方法,函数名加

function.method(添加

如果(typeof =数的| |类型!B!=数){

把{

名字:TypeError

消息:Add方法必须发送到数字

};

}

返回A+;

});

添加函数的方法

(函数(){())

尝试{

警报(function.add(1, 3)); / /输出:4

} catch(e){

如果(查询= 'typeerror){

警报(e.message);

}

}

});

删除字符串的两端

string.method(修剪

返回this.replace( / ^ + | + $ /克,);

});

警报(Hello World的| +(。饰)+ | '); / /输出:|你好世界|

数字积分函数

number.method(整

这样可以调用一个函数,如:(数学,随机数学{ }(随机)的数学{)= = = =随机}()

返回数学{ < 0'ceil:'floor}(本);

});

警报((- 10 3)((整数)); /输出:- 3



8、递归调用(参数。被叫方)

递归调用本身就是调用自己。调用分为:在指定值下显示的直接调用和间接调用,用递归调用计算斐波那契序列。

复制代码代码如下所示:

为阶乘的i

函数阶乘(i){

如果(i < 2){

返回1;

}

返回我的阶乘(i-1); / /递归调用

}

警报(阶乘(5));5个阶乘

有问题吗如下:

var =函数(i){

如果(i < 2){

返回1;

}

返回我的阶乘(i-1); / /因子可以被称为不能

}

var测试=阶乘;

阶乘=null;

警报(测试(2));

/解决方案:

var =函数(i){

如果(i < 2){

返回1;

}

回到我arguments.callee(i-1); / / arguments.callee返回正在执行的函数对象,文本是由函数对象指定

}

var测试=阶乘;

阶乘=null;

警报(测试(5));



9、诉讼范围

复制代码代码如下所示:

在程序中,可见性和生命周期变量的控制范围。

var;

功能getName(){

变量名=同; / /同域

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

VaR的名字=名字;

}

警报(我+名字+ ); / / 2,名字注:无阻滞范围在JS,如果,while语句和变量放在定义域块的作用

返回的名称;

}

警报(同)(同); / /注:JS功能范围,所以在函数内部定义的变量在外部是不可见的

警报(名称);



注:在许多现代语言,延迟声明建议作为变量的可能。如:java和js,不推荐,因为JS不支持块级范围。建议申报所有用在函数的开头的变量。

10。关闭

函数可以调用所创建的环境的上下文,称为闭包。范围的好处是内部函数可以访问外部函数的所有变量(除了这个和参数)。

复制代码代码如下所示:

VaR MyObject = { {

值:0,

增量:函数(公司){

this.value = = 'number'inc类公司:1;

},

GetValue:函数(){

返回this.value;

}

};

(10)myobject.increment;

警报(MyObject。值);

警报(myobject.getvalue());

/ /上面用文字的方式来定义一个MyObject对象。但值的变量可以由外部对象访问

VaR MyObject =函数(){()

var值= 0;

返回{

增量:函数(公司){

值类型inc'number=公司:1;

},

GetValue:函数(){

返回值;

}

};

(});

(10)myobject.increment;

警报(MyObject。值); / /不由外部对象访问

警报((MyObject。GetValue)); / / 10

身体渐变背景(黄色到白色)

var =函数(节点){

var级别= 1;

函数(){()

VaR进制= level.tostring(16);

node.style.backgroundcolor =# FFFF +诅咒+六;

如果(级别< 15){

级别= 1;

setTimeout(步骤500); / /如果水平低于15,而内部函数调用自身

}

};

setTimeout(步骤1); / /调用内部函数

};

淡入淡出(文档,正文);

这是一个非常糟糕的例子。

单击单击显示3…

单击单击显示3…

单击单击显示3…

无功add_the_handlers =功能(节点){

var i;

为(i = 0;i < nodes.length;i = 1){

结{我}。onclick=功能(e){ / /功能结构:我

警报(一);

};

}

};

var obj = document.getelementsbyname(测试);

add_the_handlers(对象);

造成上述情况的原因是:一个标记事件函数来绑定变量i在构建i值时不起作用。

以下解决方案:

无功add_the_handlers =功能(节点){

var i;

为(i = 0;i < nodes.length;i = 1){

结{我}。onclick=功能(我){

返回函数(e){

警报(i);i输出在构造函数i中传递,而不是事件处理绑定i。

};

}(一);

}

};

var obj = document.getelementsbyname(测试);

add_the_handlers(对象);



11、回调(回调)

复制代码代码如下所示:

/ /数据参数,并call_function表示回调函数

功能sendrequest(数据,call_function){

/ / setTimeout模拟客户端请求数据传输服务器。

当3秒后调用回调函数(客户端回调函数)

setTimeout(){()函数(

call_function(数据); / /调用回调函数

},3000);

}

/ / sendrequest功能测试

sendrequest(参数

警报(上下文+上下文);

});



12、模块

模块是一个函数或对象,它提供一个接口来隐藏状态和实现。

一般形式:定义私有变量和函数的函数;使用闭包创建可以访问私有变量和函数的特权函数;最后,返回特权函数,或将其保存到可访问的位置。

复制代码代码如下所示:

function.prototype.method =函数(名称、函数){

这个原型{ {函数};

返回此;

};

string.method(deentityify

var实体{ { {

,

LT:< <,

gt > >

};

返回函数(){

返回this.replace / /(g(} + { ^;;),功能(A,B){ / /,如何知道b的值,了解正则表达式

var =实体{ };

返回类型R =字符串:一;

});

};

}();

(通知)(。deentityify); / /测试:



注意:模块模式通常与单例模式相结合。Javascript的单例模式是对象文字创建的对象。对象的属性值可以是数字的或函数的,属性值在对象的生命周期中不会改变。

13,级联(连锁经营)

对于一些不返回值的方法,我们返回这个,而不是未定义的,然后我们可以开始使用级联(链)来操作对象:

复制代码代码如下所示:

函数(id){

var obj = document.getelementbyid(ID);

obj.setcolor =功能(彩色){

this.style.color =颜色;

返回此;

};

obj.setbgcolor =功能(彩色){

this.style.backgroundcolor =颜色;

返回这个;返回这个对象,启动级联

};

obj.setfontsize =功能(大小){

this.style.fontsize =尺寸;

返回此;

};

返回对象;

};

$(测试),SetColor(红)

。setfontsize(30px )

。setbgcolor(蓝色);

改进的代码:

(函数(id){)

var =功能(ID){ _美元

this.element = document.getelementbyid(ID);

};

_原型= { {美元。

设置颜色:功能(彩色){

this.element.style.color =颜色;

返回此;

},

setbgcolor:功能(彩色){

this.element.style.backgroundcolor =颜色;

返回此;

},

setfontsize:功能(大小){

this.element.style.fontsize =尺寸;

返回此;

}

};



添加到窗口原型链

窗口($ =函数(id){){

返回(ID)_美元;

};

});

$(测试),SetColor(红)

。setfontsize(30px )

。setbgcolor(蓝色);



14、申请

所谓的应用是函数和传递给它的参数的组合,以产生一个新的函数,例如,在下面的代码中定义一个添加()函数,它可以返回一个新函数,并将参数值传递给新函数,从而实现连续操作。

复制代码代码如下所示:

/第一种方式:

函数(a){

返回函数(b){

返回A+;

}

};

警报(添加(1)(2));3

第二种方法:参数

var =函数(){()

参数;

返回函数(){

var总和= 0;

对于(var i = 0;i < arg.length;i++){

求和;

}

为(i = 0;i < arguments.length;i++){

总和=参数{ };

}

收起回复;

}

};

警报(添加(1,2,3)(4,5,6)); / / 21

第三种方法:通过应用方法(咖喱)实现

var =函数(){()

var总和= 0;

对于(var i = 0;i < arguments.length;i++){

总和=参数{ };

}

收起回复;

};

原型链添加函数的方法

function.prototype.method =函数(名称、函数){

这个原型{ {函数};

返回此;

};

应用方法

Function.method('curry,函数(){(){

/ /片的阵列的方法,参数也有一个连接的方法

var片= array.prototype.slice,

args = slice.apply(参数),=这;

返回函数(){

返回that.apply(null,args.concat(slice.apply(参数)));

};

});

警报(add.curry(1,2)(3,4)); / / 10



15。记忆

函数可以使用对象来记住以前操作的结果,从而避免不必要的操作。

复制代码代码如下所示:

函数(){()

VaR MOME = {0,1}; / /存储计算数据

函数(n){

VaR结果=笨蛋{ };

如果有计算数据直接计算,然后缓存计算结果。

如果(typeof的结果!=数){

结果= FIB(n-1)+ FIB(n-2);

MOME {N} =结果;

}

返回结果;

};

返回FIB;

(});

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

document.writeln( / / +我+++ fibonacci(i));

}

/ / ==========================

创建具有内存功能的

/ / ==========================

VaR的memoizer =功能(备忘录,基本){

函数(n){

var结果=备忘录{ };

如果(typeof的结果!=数字){

结果=基本(shell,n);

备忘录结果;

}

返回结果;

};

返回壳;

};

的memoizer /斐波那契序列记忆功能

var fibonacci = memoizer({0,1},功能(壳,N){

返回壳(n-1)+外壳(n-2);

});

/ /完整的memoizer阶乘的记忆功能

VAR因子= memoizer({ 1,1 },功能(壳,N){

返回n * shell(n-1);

});

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

document.writeln( / / +我+++因子(I));

}



这是非常实际的,如果有一个缺失的地方,并要求上帝指出并共同进步。