在JavaScript学习中不少的小伙伴们都会在函数这方面有某些问题,对于JavaScript函数这方面小编为大家整理了有关于在JavaScript函数定义的方法分享,希望对大家的学习有所帮助!
方法一:函数定义语句
我们现在来看下代码:
//求和函数
function sum(a,b){
return a+b;
}
上面的这个代码时我们比较典型的函数声明,通过以function之后其后在跟随函数的名称标识符、小括号和中大括号。对于这种函数定义方式我们是需要显示指定的函数名称,我们在代码执行中可以通过函数名称来调用我们的函数,我们可以看看下面的例子:
console.log(sum); //控制台输出sum函数的源代码,此时函数还未定义
function sum(a,b){
return a+b;
}
console.log(sum(2,3)); //5
既然上面介绍了有关于函数声明之后,那对于函数的作用域就不得不说一下了,函数作用域是指在函数中声明的所有变量的函数体始终可见,这就说明了我们的变量在声明之前已经可以使用,通过这个特点我们可以称它为声明提前,下面我们来看一串代码:
var scope = "global";
function f(){
console.log(scope); //输出“undefined”,而不是“global”
var scope = "local"; //变量在这里赋初始值,但变量本身在函数体内任何地方均是有定义的
console.log(scope); //输出“local”
}
f();
以上代码等价于
var scope = "global";
function f() {
var scope; //在函数顶部声明了局部变量,即声明提前
console.log(scope); //变量存在,输出“undefined”,而不是“global”
var scope = "local"; //变量在这里赋初始值
console.log(scope); //输出“local”
}
f();
在代码中我们在函数体内声明所有变量,而且在声明之前就已经有了定义,但是呢只有在执行这个变量时候才会被赋值。
方法二:函数直接量表达式
我们先来看看下面代码:
//求阶乘的函数
var factorial = function fact(x){ //将函数赋值给一个变量
if(x<0) {return NaN;}
else if(x===0) {return 1;}
else
return x*fact(x-1); //递归函数
};
console.log(factorial(3)); //6
在代码中我们可以看出,它与函数定义语句是一样的,通过使用我们的 function。然而一般这种方式的定义是使用于将它作为一个大的表达式的一部分的,就像是在赋值、调用和定义函数类似。那么这种方式的话是比较适合对于哪些在开发中只会被使用到一次的函数。如下所示:
var f=function(x){ //省略函数名的匿名函数
return x*x;
}
与函数定义语句不同的是,函数直接量表达式是在执行到代码时才加载函数的,我们可以用下面的代码来说明。
console.log(f); //控制台输出undefined,此时函数f还未加载
var f=function(x){ //开始加载函数
return x*x;
}
console.log(f); //控制台输出函数的源代码
方法三:Function()构造函数
先看代码:
var f = new Function("x","y","return x+y"); //Function()构造函数
var f = function(x,y){return x+y}; //这两条代码是等价的
通过这个方法我们可以传入任意数量的字符串实参,而且最后一个实参所表示的文本是函数体,这个方法它是可以包含任意数量的JavaScript语句的,而且在使用的时候如果构造的函数不包含任何参数的话,我们只需要输入一个函数就可以了。这个方法和其他两个方法是不一样的,这个方法是允许JavaScript在运行的时候动态地创建翻译函数,而且我们每次在调用这个方法的时候函数都会进行解析函数体。所以在多次使用或者循环使用的话,效率是会受到影响的。相比之下循环中的嵌套函数和函数定义表达式就不会每次执行的时候进行重新编译。
对于这个构造函数还有一点是值得我们注意的,那就是它所创建的函数并不是使用词法作用域,都因为函数体代码在编译的时候总在顶层函数执行,代码如下所示:
var a = 3; //在顶层函数中声明变量a
function f(){
var a = 2; //在函数体内声明局部变量a
return new Function("return a*a;"); //无法捕获局部作用域
}
console.log(f()()); //控制台输出9而非4,说明构造函数的编译在顶层函数执行
那么对于这个问题我们可以在全局作用域中进行执行eval()。
总结:
以上就是有关于“JavaScript怎么定义函数?”这个问题的相关内容,希望对大家的学习和了解有所帮助,当然如果你有更好的方法也可以和大家一同分享,跟多有关于JavaScript这方面的内容我们都可以在W3Cschool中进行学习和了解。