1.函数声明
使用关键字funciton关键字来声明,后面跟上一组参数以及函数体.
无参数
function boy() { //函数的声明
//代码
}
函数的声明已经完成,但是还不能运行,这是我们需要调用函数才能是这个函数运行.
box(); //函数的调用,调用的位置可以放在函数声明的前面
有参数
function boy(name,age) {
//代码
}
boy("name",age);
如果不传参数进去,就会定义为undefined
函数表达式
var print = function (){
// ...
};
采用函数表达式声明函数时,function命令后面不带有函数名。如果加上函数名,该函数名只在函数体内部有效,在函数体外部无效。
var print = function x(){
console.log(typeof x);
};
x
// ReferenceError: x is not defined
print()
// function
这个x只在函数体内部可用,指代函数表达式本身,其他地方都不可用。这种写法的用处有两个,一是可以在函数体内部调用自身,二是方便除错(除错工具显示函数调用栈时,将显示函数名,而不再显示这里是一个匿名函数)
需要时,可以采用下面的形式声明函数。
var f = function f() {};
函数的属性和方法
name属性
name属性返回紧跟在function关键字之后的那个函数名
function f1() {}
f1.name // 'f1'
var f2 = function () {};
f2.name // ''
var f3 = function myName() {};
f3.name // 'myName'
length属性
返回函数定义中参数的个数
function f(a, b) {}
f.length //2
toString
返回函数的源码
function f() {
a();
b();
c();
}
f.toString();
function f() {
a();
b();
c();
}
函数内内部的注释也是可以返回的
函数内部的变量提升
var 命令声明的变量,不管在什么位置,变量声明都会被提升到函数体的头部.
function foo(x) {
if (x > 100) {
var tmp = x -100;
}
}
等同于
function foo(x) {
var tmp;
if (x > 100) {
tmp = x -100;
}
}
函数本身的作用域
函数本身也有一个值,也有自己的作用域.她得作用域绑定其声明时所在的作用域
var a = 1;
var x = function () {
console.log(a);
};
function f() {
var a = 2;
x();
}
f(); //1
函数x在函数f的外面声明的,所以它的作用域绑定外层,内部变量a不会到函数体f体内取值.
2.return返回值
函数都是调用后直接执行的.实际上,任何函数都可通过return语句跟后面的要返回的值来实现返回值.
function boy() {
return "Hello world!" //表示把这句话字符串返回回来
}
这时我们使用boy()进行调用,是没有作用的.
它实际进行的操作为:
boy() = "Hello world!";
alert(boy()); //调用函数返回值,然后输出
有参数的同理是一样可以得到的.
我们还可以把函数的返回值赋给一个变量,然后通过变量进行操作.
var strInfo = boy('马云',40);
alert(strInfo);
return与具有还有一个功能是退出当前函数
function boy() {
if( num < 5 ) return num; //满足条件,返回num
return 100; //返回之后,就不执行下面的语句了
}
alert(box(10));
3.arguments对象
ECMAScript函数不介意传递进来多少参数,也不会因为参数不统一而错误.实际上,函数体内可以通过arguments对象来接收传递进来的参数.
function boy() {
return arguments[0]+'|'+arguments[1]+'|'+arguments[2];
}
boy("boy",23,"web前端");
可以利用length的属性(arguments.length),来进行动态操作.
4.重载:根据不同的参数调用相同的函数
function box(num,a) {
return num + 100;
}
function box(num) { //第二个函数把第一个函数覆盖掉,不具备重载功能
return num + 150;
}
alert(box(50,1));
//重载就是根据参数,选择相同函数名而参数不同的函数