JavaScript 函数定义
JavaScript 使用关键字 function 定义函数
函数可以通过声明定义,也可以是一个表达式
函数声明
函数声明的语法 :
functionsum1(n1,n2){ returnn1+n2;};
函数声明后不会立即执行,会在我们需要的时候调用到
分号是用来分隔可执行JavaScript语句,由于函数声明不是一个可执行语句所以不以分号结束
函数表达式,又叫函数字面量
JavaScript 函数可以通过一个表达式定义
函数表达式可以存储在变量中:
var sum2=function(n1,n2){ return n1+n2;};
在函数表达式存储在变量后,变量也可作为一个函数使用:
两者的区别:解析器会先读取函数声明,并使其在执行任何代码之前可以访问;而函数表达式则必须等到解析器执行到它所在的代码行才会真正被解释执行。
var x = function(a, b){return a * b};var z = x(4, 3);
以上函数实际上是一个 匿名函数 (函数没有名称)。函数存储在变量中,不需要函数名称,通常通过变量名来调用。上述函数以分号结尾,因为它是一个执行语句。
函数的几种写法
1 常见写法:
functionTest(){ alert("test");}Test()
2 匿名函数:
var test=function(){ alert("test");}test();
3 自调用函数:
(function () { alert('test'); })();
4 函数嵌套:
var Test = { test1:function(){ alert('test1'); }, test2:function(){ alert('test2'); }}var t = Test.test1();
5 函数继承和构造函数
var Test = function(){};Test.prototype={ test1:function(){ alert('test1'); },test2:function(){ alert('test2'); }}var t = new Test();t.test2();
Function() 构造函数
在以上实例中,我们了解到函数通过关键字 function 定义。函数同样可以通过内置的 JavaScript 函数构造器(Function())定义
var myFunction = newFunction("a", "b", "return a * b");var x = myFunction(4, 3);
实际上,你不必使用构造函数。上面实例可以写成:
var myFunction = function(a, b){return a * b}var x = myFunction(4, 3);
在 JavaScript 中,很多时候,你需要避免使用 new 关键字
函数提升(Hoisting)
提升(Hoisting)是 JavaScript 默认将当前作用域提升到前面去的的行为。
提升(Hoisting)应用在变量的声明与函数的声明,因此,函数可以在声明之前调用:
myFunction(5); functionmyFunction(y) { returny * y; }
使用表达式定义函数时无法提升
myFunction(5); var myFunction = function(y){ return y * y; }
以上代码运行即会报错,原因在于函数位于一个初始化语句中,而不是一个函数声明。换句话讲,在执行到函数所在的语句之前,变量myFunction中不会保存有对函数的引用;而且,由于第一行代码就会导致“unexpected identifier”(意外标识符)错误,实际上也不会执行到下一行。
除了声明时候可以通过变量访问函数这一点区别之外,函数声明与函数表达式的语法其实是等价的。
自调用函数
函数表达式可以 "自调用"。自调用表达式会自动调用。如果表达式后面紧跟 () ,则会自动调用。不能自调用声明的函数。通过添加括号,来说明它是一个函数表达式:
(function(){ var x = "Hello!!"; // 我将调用自己})();
以上函数实际上是一个 匿名自我调用的函数
自调用函数可用来传参带返回值
var sum=(function(x,y){ return x+y;})(2,3);console.log(sum);
自执行函数严格来说也叫函数表达式,它主要用于创建一个新的作用域,在此作用域内声明的变量,不会和其它作用域内的变量冲突或混淆,大多是以匿名函数方式存在,且立即自动执行。
JavaScript函数可作为一个值使用
functionmyFunction(a, b){ return a * b;}var x = myFunction(4, 3);
JavaScript函数可作为表达式使用:
functionmyFunction(a, b){ return a * b;}var x = myFunction(4, 3) * 2;
函数是对象
在 JavaScript 中使用 typeof 操作符判断函数类型将返回 "function" ,但JavaScript 函数描述为一个对象更加准确。
JavaScript 函数有属性和方法。
arguments.length 属性返回函数调用过程接收到的参数个数:
functionmyFunction(a, b) { returnarguments.length;}document.getElementById("demo").innerHTML = myFunction(4,3,6,5);
toString() 方法将函数作为一个字符串返回:
函数定义作为对象的属性,称之为对象方法。
函数如果用于创建新的对象,称之为对象的构造函数
JavaScript 函数参数
JavaScript 函数对参数的值(arguments)没有进行任何的检查
函数显式参数与隐藏参数(arguments)
函数显式参数在函数定义时列出
functionName(parameter1, parameter2, parameter3) { code to be executed}
函数隐藏参数(arguments)在函数调用时传递给函数真正的值
参数规则
JavaScript 函数定义时参数没有指定数据类型,对隐藏参数(arguments)没有进行检测,对隐藏参数(arguments)的个数没有进行检测
默认参数
如果函数在调用时缺少参数,参数会默认设置为: undefined
有时这是可以接受的,但是建议最好为参数设置一个默认值:
functionmyFunction(x, y){ if (y === undefined) { y = 0; } }
或者,更简单的方式:
functionmyFunction(x, y){ y = y || 0;}
如果y已经定义, y || 返回y, 因为y是 true, 否则返回 0, 因为undefined为 false
如果函数调用时设置了过多的参数,参数将无法被引用,因为无法找到对应的参数名。 只能使用 arguments 对象来调用
Arguments 对象
JavaScript 函数有个内置的对象 arguments 对象。arguments 对象包含了函数调用的参数数组。通过这种方式你可以很方便的找到每个参数的值:
x = findMax(1, 123, 500, 115, 44, 88);functionfindMax() { var i, max = 0; for (i = 0; i < arguments.length; i++) { if (arguments[i] > max) { max = arguments[i]; } } returnmax;}
或者创建一个函数用来统计所有数值的和:
x = sumAll(1, 123, 500, 115, 44, 88);functionsumAll() { var i, sum = 0; for (i = 0; i < arguments.length; i++) { sum += arguments[i]; } return sum;}
通过值传递参数
在函数中调用的参数是函数的参数。
如果函数修改参数的值,将不会修改参数的初始值(在函数外定义)。
var x =