这篇文章主要讲解了“JavaScript定义函数的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript定义函数的方法有哪些”吧!

方法一:函数定义语句

我们现在来看下代码:

//求和函数functionsum(a,b){returna+b;}

上面的这个代码时我们比较典型的函数声明,通过以function之后其后在跟随函数的名称标识符、小括号和中大括号。对于这种函数定义方式我们是需要显示指定的函数名称,我们在代码执行中可以通过函数名称来调用我们的函数,我们可以看看下面的例子:

console.log(sum);//控制台输出sum函数的源代码,此时函数还未定义functionsum(a,b){returna+b;}console.log(sum(2,3));//5

既然上面介绍了有关于函数声明之后,那对于函数的作用域就不得不说一下了,函数作用域是指在函数中声明的所有变量的函数体始终可见,这就说明了我们的变量在声明之前已经可以使用,通过这个特点我们可以称它为声明提前,下面我们来看一串代码:

varscope="global";functionf(){console.log(scope);//输出“undefined”,而不是“global”varscope="local";//变量在这里赋初始值,但变量本身在函数体内任何地方均是有定义的console.log(scope);//输出“local”}f();以上代码等价于varscope="global";functionf(){varscope;//在函数顶部声明了局部变量,即声明提前console.log(scope);//变量存在,输出“undefined”,而不是“global”varscope="local";//变量在这里赋初始值console.log(scope);//输出“local”}f();

在代码中我们在函数体内声明所有变量,而且在声明之前就已经有了定义,但是呢只有在执行这个变量时候才会被赋值。


方法二:函数直接量表达式

我们先来看看下面代码:

//求阶乘的函数varfactorial=functionfact(x){//将函数赋值给一个变量if(x<0){returnNaN;}elseif(x===0){return1;}elsereturnx*fact(x-1);//递归函数};console.log(factorial(3));//6

在代码中我们可以看出,它与函数定义语句是一样的,通过使用我们的 function。然而一般这种方式的定义是使用于将它作为一个大的表达式的一部分的,就像是在赋值、调用和定义函数类似。那么这种方式的话是比较适合对于哪些在开发中只会被使用到一次的函数。如下所示:

varf=function(x){//省略函数名的匿名函数returnx*x;}与函数定义语句不同的是,函数直接量表达式是在执行到代码时才加载函数的,我们可以用下面的代码来说明。console.log(f);//控制台输出undefined,此时函数f还未加载varf=function(x){//开始加载函数returnx*x;}console.log(f);//控制台输出函数的源代码

方法三:Function()构造函数

先看代码:

varf=newFunction("x","y","returnx+y");//Function()构造函数varf=function(x,y){returnx+y};//这两条代码是等价的

通过这个方法我们可以传入任意数量的字符串实参,而且最后一个实参所表示的文本是函数体,这个方法它是可以包含任意数量的JavaScript语句的,而且在使用的时候如果构造的函数不包含任何参数的话,我们只需要输入一个函数就可以了。这个方法和其他两个方法是不一样的,这个方法是允许JavaScript在运行的时候动态地创建翻译函数,而且我们每次在调用这个方法的时候函数都会进行解析函数体。所以在多次使用或者循环使用的话,效率是会受到影响的。相比之下循环中的嵌套函数和函数定义表达式就不会每次执行的时候进行重新编译。

对于这个构造函数还有一点是值得我们注意的,那就是它所创建的函数并不是使用词法作用域,都因为函数体代码在编译的时候总在顶层函数执行,代码如下所示:

vara=3;//在顶层函数中声明变量afunctionf(){vara=2;//在函数体内声明局部变量areturnnewFunction("returna*a;");//无法捕获局部作用域}console.log(f()());//控制台输出9而非4,说明构造函数的编译在顶层函数执行

那么对于这个问题我们可以在全局作用域中进行执行eval()。

感谢各位的阅读,以上就是“JavaScript定义函数的方法有哪些”的内容了,经过本文的学习后,相信大家对JavaScript定义函数的方法有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!