定义
函数是由事件驱动或者当被调用时可重复执行的代码块
好处:减少代码冗余 增加灵活性 便于维护 提高可扩展性
定义函数三种方式:
1)函数声明
function name(){//具体的语句}
2)函数表达式:
var functionName = function(){//具体的语句}
3)借助内置一个方法(Function),构造函数方式
var functionName = new Function();
形参和实参的区别
形参:当定义一个函数时,在小括号里写的变量
实参:在调用一个函数是,写在括号里的值或变量
形参和实参是一一对应的,形参比实参多,多余的形参默认会取到underfined,实参比形参多,多余的实参无效。
js引擎在执行js代码时的两步操作
1、先扫描环境中所有的声明(变量声明,函数声明),将这些声明提升到对应环境的最顶端
2、具体的代码执行,在对应的地方进行执行
foo(); //报错 foo is not a function , is undefined
var foo = function(){ //提升 提升的是函数名
console.log("a");
}
arguments
arguments:在函数内使用,表示传给该函数的所有的实参的集合
用处://在无法确认形参的个数,有需要传递实参时,
function foo(){
console.log(arguments);
console.log(arguments[0]);//取到第一个实参
console.log(arguments[3]);//取到第4个实参
console.log(arguments.length);//实参的个数
console.log(arguments[arguments.length-1]);//去最后一个数
}
return
1.结束函数执行 2。函数的返回值 函数运行之后的结果
//如果一个函数没有return或者return后面没有具体的值,则函数的返回值为undefined
函数作用域
作用域:变量或者函数能够被访问到的范围
全局作用域
1)最外层函数外通过var来声明的变量或者声明的函数具有全局作用域
2)在函数内不通过var来定义的变量
3)window对象的属性和方法具有全局作用域
//当环境中未定义,而直接可以使用的一些变量或者函数
局部作用域
1)在函数内部通过var来声明的变量
2)函数的形参具有局部作用域,局部变量
//ES5中,函数是区分全局和局部唯一的代码块
函数参数
参数选择顺序:
选择参数时,就近原则,如果有局部,先局部,后全局,最后window,报错
函数内部有声明 提升
eg:
var a = 10;
function foo(){
console.log(a); //在函数内部有声明提升相当于函数开头有了个var a;
var a = 20;
}
foo();
console.log(a);//两个值是:underfined 10
// 形参相当于在函数内部声明了var a
事件处理函数
txt.oninput = function(){console.log(txt.value);}//oninput
txt.onchange = function(){console.log(txt.value);}//onchange
构造函数
一个普通函数,当它和new运算符一起使用时,该函数称为构造函数,通常会将构造函数的首字母大写。
//对象类型
var obj = {};//是一个对象,但是这个对象没有属性和方法
//如果来取到属性值,如果来调用方法 对象名.属性名 对象名.方法名()
//如果一个对象没有某个属性或者方法,那么取值时会得到underfined
//添加属性 如果对象里已经有某个属性,会覆盖
//删除 delete person.sexy;
递归函数
在一个函数内部调用自身,称该函数为递归函数