定义函数
方法一:函数声明
函数声明要素:function关键字,functionName函数名,arg参数(可选)
语法
function functionName(arg){
//函数体
}
示例
function square(number) {
return number * number;
}
var a = 2;
square(a); //4
需要注意的地方:
当函数的参数是一个值(比如上面的例子),
若被调用函数改变了这个参数的值,这样的改变不会影响到全局或调用的函数。
但当函数的参数是一个对象(即一个非原始值,例如Array或用户自定义的其它对象),
若函数改变了这个对象的属性,这样的改变对函数外部是可见的。
function myFunc(theObject) {
theObject.make = "Toyota";
}
var mycar = {make: "Honda", model: "Accord", year: 1998},
var x, y;
x = mycar.make; // x 获取的值为 "Honda"【原本】
myFunc(mycar);
y = mycar.make; // y 获取的值为 "Toyota"【现在】(make属性的值在函数中被改变了)
方法二:函数表达式
函数表达式要素:var关键字,variableName变量名,表达式赋值等号,声明变量后的分号,
functionName函数名(可选,没有的话叫做匿名函数)
语法
var variableName = function functionName(arg){
//函数体
};
示例1(匿名函数)
var square = function(number) {
return number * number;
};
var x = square(4); // x 得到的值为16
示例2(函数表达式也可以提供函数名,并且可以用于在函数内部使用来代指其本身,或者在调试器堆栈跟踪中鉴别该函数)
var factorial = function fac(n) {return n<2 ? 1 : n*fac(n-1)};
console.log(factorial(3));
var x = square(4); // x 得到的值为16
需要注意的地方:
使用Function构造函数也可以定义函数,不过因为性能问题不推荐使用,在此仅作了解就好语法
var variableName = new Function("arg0","arg1","函数体"); //函数是对象,函数名是指针,一个函数可能会有多个名字~~ //当一个对象的属性是函数时,其称之为方法。
函数声明和函数表达式的区别
虽然都可以定义函数,但最大的区别在于:
解析器会率先读取函数声明,使其在执行任何代码之前就可以访问(也就是 函数声明提升);
而函数表达式则需要解析器执行到它所在的代码行才会被解释执行。
sayHi();//能正常运行 弹Hi
sayHi123();//报错 Uncaught TypeError: sayHi123 is not a function(…)
function sayHi(){
alert('Hi');
}
var sayHi123 = function sayHi(){
alert('Hi123');
};