1、定义:程序中封装一项任务的步骤清单的代码段,再起一个任务名
函数是一个引用类型的对象
对象:内存中一块同时存储多个值的空间
何时使用:发现一项任务会被反复调用,要先将任务步骤封装为一个函数,再反复调用。
如何声明函数:
function 任务名([参数变量列表]){
步骤清单代码段;
[return 返回值];
}
如何调用函数:函数名([参数值列表]);
强调:1、函数只有在调用时,才会执行!
2、函数可被反复调用!——代码重用(提高复用性,便于维护,一次定义处处可用,一次修改处处生效。。。)
参数变量:专门接收方法执行所必须的数据的变量
何时使用:如果一个函数,必须提供指定数据,才能正常执行时,
需要提供几个数据,就定义几个参数接收
如何使用参数:无需var,直接在函数名后的括号中定义参数名,每个参数名用逗号分隔;
何时,如何传入参数值:调用时,按照参数定义的个数和顺序传入
为什么使用参数:参数可以让方法变得更灵活;
2、内存中函数生命周期(函数执行过程):
1、定义时:将函数直接封装在一个对象中保存
函数名,其实是指向对象的一个变量
定义时,不会读取函数的内容(所以就算函数体中有错误,也不会报错,不会影响函数之后的内容执行)
2、调用时:在执行环境中增加一个当前函数的执行环境对象
才会逐行读取并执行函数的内容
3、调用后:函数的执行环境弹出,活动对象被释放,内存中又恢复到定义时的样子
图1-1函数执行时的大概过程
图 1-2 定义时和调用后
图1-3函数执行过程
3、作用域:一个变量的可用范围
本质其实是一个存储多个变量的对象
2种:1、全局作用域:专门保存全局变量的对象
全局变量:在任何时候,任何位置都可被访问
2、函数作用域:专门保存函数内部的局部变量的对象
——活动对象
局部变量:2类:1、所有的参数变量
2、在函数内部声明(var出来)的变量
只在函数调用时的函数内部才可用
概念解释:
活动对象:专门保存*本次*函数调用时需要的所有数据的对象。
页面刚加载时:会有一个执行环境栈(ECS) ,ECS 中只有一个全局(EC)元素
全局 EC 引用 window 对象
声明时: 首选创建函数对象: 专门存储函数定义的空间 ---函数名指向这个函数对象
函数调用时,执行环境栈(ECS)中会压入一个函数执行环境 EC ,同时函数执行环境 EC为本次函数调用创建活动对象 AO 调用时自动创建,调用后自动释放。
调用时: 使用*当前引擎所在的 EC*中的变量,执行函数体中的步骤清单。
调用后: 本地函数调用的 EC 出栈->活动对象 AO 释放
4、返回值:函数调用的执行结果
何时使用:只要函数的执行,需要有明确的返回结果时,要看调用者是否需要获得执行结果;
(定义几个参数,起什么函数名看谁:看函数定义本身需要不需要)
何时如何获得返回值:调用时:
var 变量=函数名(xx)
返回值只能是一个值不能是多个
5、***按值传递:两变量间赋值或向函数中传递参数时,
都是将原变量中的值复制一个副本给对方
修改一方,另一方不受影响
6、***声明提前:在正式执行程序之前,都会先预读所有var 声明的变量和function声明的函数,集中到当前作用域的顶部集中声明,赋值留在原地
7.定义函数的第二种方法:
var 函数名= function(参数){函数体;return 返回值}
VS 声明函数
第二种方法,函数定义不会提前,仅函数名提前
声明函数,整体(函数名+函数定义)提前
总结一:如果一个表达式或函数有结果,就可直接当一个值用