定义

函数是由事件驱动或者当被调用时可重复执行的代码块
好处:减少代码冗余 增加灵活性 便于维护 提高可扩展性

定义函数三种方式:

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;

递归函数

在一个函数内部调用自身,称该函数为递归函数