1函数声明:
(1)function命令:
function foo(){
//函数体
};
(2)函数表达式:
匿名函数表达式:
var print=function(){
//函数体
//将匿名函数赋值给变量,
};
命名式函数表达式:若将一个有函数名的函数赋值给变量,则此函数名只在函数内部有效:
var print=function foo(){
alert(typeof foo);
};
foo;//foo is not defined(…)
print();//function
这种写法的用处有两个,一是可以在函数体内部调用自身,二是方便除错(除错工具显示函数调用栈时,将显示函数名,而不再显示这里是一个匿名函数)
函数的表达式需要在语句的结尾加上分号,表示语句结束。而函数的声明在结尾的大括号后面不用加分号。
立即执行函数表达式:
(function(){
//函数体
})();
作为返回值
return function(){
//函数体
}
(3)Function构造函数
var add = new Function(
'x',
'y',
'return (x + y)'
);
Function构造函数接受三个参数,除了最后一个参数是add函数的“函数体”,其他参数都是add函数的参数。
Function构造器内部创建的变量是局部变量。在Function构造器外部无法访问。
Function构造器能使用全局变量,但是,不能使用自由变量
var globalVal="hello";
(function(){
var localVal="world";
Function('console.log(typeof localVal,typeof globalVal);')();
})();
//undefined string
函数表达式和函数声明的区别:
函数声明会被前置,函数表达式则不会。
sum(1,2);//可以在函数声明前调用
function sum(a,b){
alert(a+b);
}
//result:3
相当于:
function sum(a,b);
sum(1,2);//可以在函数声明前调用
function sum(a,b){
alert(a+b);
}
函数表达式:
add(1,2);
var add=function sum(a,b){
alert(a+b);
}
//result:add is not a function(…)
相当于:
var add;
add(1,2);
var add=function sum(a,b){
alert(a+b);
}
//result:add is not a function(…)
函数声明 | 函数表达式 | 函数构造器 | |
前置 | √ | ||
允许匿名 | √ | √ | |
立即调用 | √ | √ | |
在定义该函数的作用域通过函数名访问 | √ | ||
没有函数名 | √ |
2函数的属性和方法:
1name属性:函数的name属性总是返回紧跟在function关键字之后的那个函数名。
匿名函数的name属性总是为空字符串。
2length属性:length属性返回函数预期传入的参数个数,即函数定义之中的参数个数。
3toString()方法:返回函数源码。(函数内部的注释也可以返回)
3函数作用域:
在函数外部声明的变量就是全局变量(global variable),它可以在函数内部读取。
在函数内部定义的变量,外部无法读取,称为“局部变量”(local variable)。
注意,对于var命令来说,局部变量只能在函数内部声明,在其他区块中声明,一律都是全局变量。
函数本身的作用域:
函数本身也是一个值,也有自己的作用域。它的作用域与变量一样,就是其声明时所在的作用域,与其运行时所在的作用域无关。
4函数参数:
函数参数不是必需的,Javascript允许省略参数。被省略的参数默认值为undefined。
通过下面的方法,可以为函数的参数设置默认值。
function f(a) {
(a !== undefined && a !== null) ? a = a : a = 1;
return a;
}
f() // 1
f('') // ""
f(0) // 0
上面代码中,函数f的参数是空字符或0,都不会触发参数的默认值。
5参数传递:
1值传递:函数内部修改参数,不会影响函数外部。
2引用传递(数组,对象,其它函数)
如果函数内部修改的,不是参数对象的某个属性,而是替换掉整个参数,这时不会影响到原始值。
var obj = [1, 2, 3];
function f(o){
o = [2, 3, 4];
}
f(obj);
obj // [1, 2, 3]
上面代码中,在函数f内部,参数对象obj被整个替换成另一个值。这时不会影响到原始值。这是因为,形式参数(o)与实际参数obj存在一个赋值关系。
o = obj;
参考: 点击打开链接
点击打开链接