手机版

详细解释JavaScript函数

时间:2021-09-21 来源:互联网 编辑:宝哥软件园 浏览:

函数是一组可以随时随地运行的语句。函数是ECMAScript的核心非常重要。函数是事件驱动的或可重用的代码块,在调用时执行。也就是说,函数是一段只定义一次但可以被调用或执行任意次的JavaScript代码。有时函数有参数,这些参数是局部变量,在调用函数时指定值。函数经常使用这些参数来计算返回值,返回值也成为函数调用表达式的值。1.函数声明函数是任何语言的核心概念。任何数量的语句都可以由函数封装,并且可以随时随地调用和执行。JS中的函数是用function关键字声明的,后面是一组参数和函数体。该函数的基本语法如下:

span style=' font-size :18 px;'函数名(arg0,arg1,argn){ statements }/span ecmascript指定了三种类型的函数声明:(1)普通函数声明。

span style=' font-size :18 px;'功能框(num1,num 2){ return num 1 num 2;}/span(2)用变量初始化什么声明函数?

span style=' font-size :18 px;'var box=function(num1,num 2){ return num 1 num 2;}/span (3)使用Function构造函数声明复制代码如下: span style=' font-size :18 px;'vax box=新函数(' num1 ',' num2 ',' num1,num 2 ');/span II。函数的类型和函数的调用ECMAScript语法规定:(1)不带参数的函数:在声明函数时没有参数,调用函数时可以直接使用。

功能框(){ document.write('我是中国人!');} box();//函数调用的结果是:我是中国人!(2)带参数的函数:声明函数时,同时定义参数变量,可能有多个参数。

功能框(姓名、年龄){document.write('您的姓名为:'姓名',年龄为:'年龄');}箱('张三','二十四');//函数调用的结果是:你的名字叫张三,你的年龄是24(3)有返回值的函数,有参数的函数,没有参数的函数,没有定义的返回值,而是在调用后直接执行。事实上,任何函数都可以通过return语句后跟要返回的值来实现返回值。

功能框(){返回‘我是中国人!’;} document . write(box());输出同上:我是中国人!2)带参数的函数。

功能框(姓名、年龄){ return }您的姓名为:“姓名”br/“您的年龄为:“年龄;} document.write(box('张三',' 24 ');//函数调用document . write(' HR/');Var demo=box('李思',' 23 ');//也可以重新分配一个新的功能文档. write(演示);运行的结果是:

(4)作为值的函数(特殊)首先,让我们看一个函数作为常规变量的例子:

函数框(sum,num){返回sum num//这里传递的是函数的返回值和普通变量一样}函数sum(num){ return num 10;} var结果=box(sum(10),10);document . write(' result=' result);页面的输出结果为:result=30,函数在下面传递,与上面仔细区分:

函数框(sum,num){返回sum(num);//这里传递的函数是} function sum(num){ return num 10;} var结果=box(sum,10);document . write(' result=' result);页面的输出结果为:result=20。3.函数的内部属性在函数内部,有两个特殊对象:arguments对象和this对象。arguments对象是一个类数组对象,它包含传递给函数的所有参数。其主要目的是保存功能参数。主要属性是长度,是动态判断函数有多少参数。但是这个对象还有一个名为被调用者的属性,它是一个指向拥有这个参数对象的函数的指针。(1)1)arguments对象的length属性JS函数不介意传入多少参数,也不会因为参数不统一而出错。事实上,传入的参数可以通过arguments对象在函数体中接收。首先,我们来看一个我们在给函数传递参数时遇到的问题:在声明一个函数时,我们不知道要定义多少个参数,但是在调用一个函数时,问题很多或者不足。

function box(){返回参数[0] '| '参数[1];} document.write(box(1,2,3,4,5,6));输出结果为:1|2。所以输出明显与我们想做的不一致,那么如何解决呢?利用arguments对象的length属性,我们可以得到参数的个数,避免上述错误。

函数box(){ return arguments . length;} document.write(box(1,2,3,4,5,6));输出:6我们也可以利用length属性智能判断参数有多少,然后合理应用参数,比如实现一个加法运算,累加所有传入的数字,但是数字的个数是不确定的。

function box(){ var sum=0;if(arguments.length==0) {返回sum} for(var I=0;长度;i ) { sum=sum参数[I];}返回总和;//返回累加结果} document.write (box (1,2,3,4,5,6));输出:21(2)arguments对象的被调用者属性仍然是一个问题:我们熟悉递归,JS也不例外。

功能框(num){ if(num=1){ return 1;} else { return num * box(num-1);//递归}} document.write(框(4));输出:24递归算法通常用于阶乘函数,因此内部调用必须是独立的。如果不改变函数名,没有问题,但是一旦改变了函数名,内部调用就需要一个一个修改。要解决这个问题,您可以改用arguments.callee。

功能框(num){ if(num=1){ return 1;} else { return num * arguments . caller(num-1)//recursive } } document . write(box(4));输出:24(3)这个对象函数内部的另一个特殊对象是这个,它的行为大致类似于Java和C#中的这个。换句话说,这是指函数操作所依据的对象,或者函数调用语句所在的范围。在全局范围内调用函数时,这个对象指的是window(window是一个对象,是JavaScript中最大的对象,也是最外层的对象)。

颜色='红色';//这里的color是全局变量,这个变量就是window的属性document . write(window . color ' br/');document . write(this . color ' br/');Var box={ color:' blue '。//这里的颜色是box下的属性,是局部变量saycolor 3360 function(){ return this . color;//此时,这只能是color } } in boxdocument . write(box . SayColor()' br/');//partial document . write(this . color);//全局操作的结果是:

四.函数属性和方法(1)函数在1)JavaScript中是对象,所以函数也有属性和方法。每个函数包含两个属性:长度和原型。length属性指示函数想要接受的命名参数的数量。

功能框(num1,num 2){ return num 1 num 2;} document . write(box . length);输出结果;至于原型属性,它是保存所有实例方法的真正地方,也就是原型。这个属性我们先不做过多介绍。原型属性下有两个方法:apply()和call(),每个函数都包含这两个非继承的方法。这两种方法的目的都是调用特定范围内的函数,这实际上等于在函数体中设置这个对象的值。

功能框(num1,num 2){ return num 1 num 2;}函数sayBox(num1,num2){ return box.apply(this,[num1,num 2]);//这表示作用域,这里是window,[]表示box}函数saybox2 (num1,num 2){ return box }所需的参数。应用(这个,参数);//arguments对象表示box} document.write (saybox (10,10)' br/')所需的参数;document.write(sayBox2(10,10));输出结果如下:20 20(2)call()方法和apply()方法与call()方法和apply()方法的扩展相同,唯一不同的是接收参数的方式。对于call()方法,第一个参数的作用域没有改变,只有其他参数直接传递给函数。

功能框(num1,num 2){ return num 1 num 2;}函数callBox(num1,num2){ return box.call(this,num1,num 2);//distinct apply()方法} document.write(callBox(10,10));输出结果是:20 call()方法和apply()方法的真正作用是扩展函数运行的范围。

颜色='红色';//全局变量var box={ color:' blue ',//局部变量};函数SayColor(){ return this . color;} document . write(SayColor()' br/');//作用域在window document . write(say color . call(this)' br/')中;//作用域在Window document . write(say color . call(Window)' br/'下);//作用域为Window下的document . write(say color . call(box));//作用域在框下,模拟输出结果为:

使用call()方法或apply()方法扩展范围的最大优点是对象不需要与方法有任何耦合关系。也就是说,box对象和sayColor()方法之间没有多余的关联操作,比如;box.sayColor=sayColor五、ECMAScript闭包ECMAScript最容易让人误解的一点是,它支持闭包。闭包指的是一个函数的词法表示,它包含未计算的变量,也就是说,一个函数可以使用在函数外部定义的变量。其实我在之前的博文里已经用过闭包了。比如JavaScript VII: JavaScript流控制语句易学中使用的变量时间是一个全局变量,函数myFunction()使用这个全局变量,这个变量不是函数本身定义的。让我们看看这个例子:

可变时间=新日期()。getHours();Document.write('当前北京时间:' time ');函数my FuncTion(){ var x=' ';if(time 20){ x=' Good day ';} document.getElementById('demo ')。innerHTML=x;} (1)在ECMAScript中使用全局变量的简单闭包实例是一个简单的闭包实例。请考虑以下代码的输出:

var sMessage=' hello world函数sayHelloWorld(){ document . write(sMessage);} sayhellowworld();在上面的代码中,脚本加载到内存后,不会为函数sayHelloWorld()计算变量sMessage的值。sMessage的值只被捕获以备将来使用,也就是说,解释器知道在调用这个函数时检查sMessage的值。当函数调用sayHelloWorld()时,将在(最后一行)分配Semessage,并显示消息“HelloWorld”。(2)复杂的闭包实例在一个函数中定义另一个将使闭包更加复杂。例如:

var iBaseNum=10//全局变量functionaddnum (inum1,inum 2){ functiondoadd(){ return inum 1 inum 2 ibasenum;}返回DOAdD();} document.write(addNum(10,10));这里,函数addNum()包括函数doAdd()(闭包)。内部函数是一个闭包,因为它将获得外部函数的参数iNum1和iNum2以及全局变量iBaseNum的值。addNum()的最后一步调用doAdd(),将这两个参数添加到全局变量中,并返回它们的总和。这里要把握的重要概念是,doAdd()函数根本不接受参数,它使用的值是从执行环境中获取的,所以输出结果是30。如您所见,闭包是ECMAScript非常强大和通用的一部分,可以用来执行复杂的计算。像任何高级函数一样,小心使用闭包,因为它们会变得非常复杂。

以上就是本文的全部内容,希望对大家的学习有所帮助。

版权声明:详细解释JavaScript函数是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。