一、函数的声明
- 声明式
function functionName(){
}
- 表达式
var functionName = function(){
};
- 对象、构造
var functionname = new function();
二、函数的调用
- functionname();
变量(声明式函数)的声明会被提升到作用域的最前面,即使写代码的时候是写在最后面,也还是会被提升至最前面。
多次声明同一个函数时,后面会覆盖前面的声明。
- 形式参数和return
function a(x,y) {
return x + y; //返回值
}
x,y是形式参数。
- 立即执行调用的表达式(匿名函数)
1.(function(){}());
2.(function(){})();
三、函数的作用域(变量存在的范围)
1、全局作用域
2.局部作用域(函数作用域)
- function 内部可以访问外部的变量,外部不能访问内部声明的变量
- 在本作用域里没有找到相应的变量时,会跳至上一级作用域继续寻 找,再赋值。
function fn(){
a = 1;
}
fn();
console.log(a);
此时可以访问函数内部的变量,因为a = 1是个全局变量。如果是var a = 1则不能访问,是局部变量。
var fn = function (){
console.log(2);
}
fn(1);
function fn(){
console.log(1);
}
此时输出值为2,函数内部使用声明的时候已经确认了变量的作用域
四、参数值的传递
- 针对原始数据类型,是将它的值传入内部
var a = 1;
function foo(x) {
a = 3;
}
foo(a);
console.log(a);
此时输出为1,var a = 1,是个数字类型,所以将值传入function内部,不受其内部 a = 3的影响。
- 针对引用数据类型,传递的是它的地址;
var b = [1,2,3];
function foo(x) {
b = [4,5,6];
}
foo(b);
console.log(b);
此时输出为[4,5,6],数组是个对象类型,属于引用类型,引用类型是将它的地址传入内部,内部赋值让它形成一个新数组。
五、属性
1.name
声明式函数中的函数名
2.length
返回函数的参数个数
六、 arguments (指向实参对象的引用)
function fn(){
console.log(arguments[0] + arguments[1] + arguments[2])
}
fn(3,5,9)
输出为17,arguments[0] = 3;arguments[1] = 5;arguments[2] = 9;
arguments是一个存放实参的对象,和数组表现形式一样,但不是数组。