函数
实现 功能 / 效果 的代码块, 就是将需要的程序封装定义在一个函数中, 通过调用函数调用对应的程序.
-
优点:
封装定义一次可以多次调用, 减少冗余的代码 有更好的可操作性和可维护性.
-
特点:
高内聚低耦合
-
步骤:
1, 封装定义 只是在定义函数程序, 没有调用执行函数程序. 2, 调用执行 函数程序 正式的被调用执行.
函数的基本语法:
封装:
声明式:
function 函数名称(){}
function是声明函数的关键词
函数名称在定义时,定义的函数名称要准守命名规范.
() 定义函数的参数
{} 定义函数的执行程序 及执行结果返回值.
赋值式: (匿名函数)
var 变量 = function(){}
没有函数名称, 使用变量名称作为函数名称.
调用函数:
声明式函数和赋值式函数, 函数程序调用语法时完全相同的,
都是函数名称/变量名称()
函数的参数
function fun1(num1 , num2=100){
console.log(num1,num2);
}
fun1(456);
// 运行结果为 456 100
/*
定义函数时, 函数()里面定义的变量为形参.
调用函数时, 定义在函数()中的称为实参, 实参就是给形参赋值的实际数据, 实参给形参赋值式按照顺序一一对应赋值的.
在定义形参时, 可以同时给形参赋值默认值, 也就是 num2这个形参在声明时, 默认赋值为100
如果num2没有赋值, 形参num2 存储使用默认值100, 如果num2执行赋值, 形参num2存储赋值的实参数据
因为实参的赋值顺序, 带有默认值的形参 一般定义在函数参数的末位.
函数的返回值
函数的返回值 (调用的只是变量中的数值, 而不是这个变量)
通过关键词 return 定义的 抛出函数封装之外的数据数值.
没有return定义执行结果返回值的函数, 调用程序执行结果都是undefined
简单的理解 return
函数() 是在调用执行函数, 可以将函数调用理解为一个表达式的运算, 例如 5+7 , 表达式需要有一个运算/执行 结果12,
函数的运算执行结果通过return 来定义的.
为什么要用return ?
函数中定义的 变量/形参 , 在函数外面不能直接调用.
只能通过return 这个关键词 将变量/形参/表达式 的数值 作为函数的执行结果返回值 抛出 函数封装之外
也就是 函数() 调用的执行结果 是return 的数据数值
可以赋值给变量储存 可以直接输出 可以做需要的操作.
return的作用1
定义函数的执行结果返回值.
return 的作用2:
终止函数程序的执行, return 之后的程序会被 终止不再执行.
通过return将指定的数据 抛出 在函数封装之外, 可以在 函数外部 操作调用 抛出的数据.
因为函数内部定义的 变量/形参 在函数外部不能直接调用, 没有定义return的函数, 执行结果返回值只能是undefined.
函数注释说明
实际项目中所有的自定义函数都必须要写函数注释说明, 所谓的自定义函数就是程序员自己定义的函数程序.
一般项目中使用
@param 定义参数的说明
@return 定义返回值的说明
如下:
isEven判断偶数
@param number number 输入的需要判断的数值
@return boolean 判断输入数据是不是偶数的结果
判断输入的数据是不是偶数
如果是偶数返回值是 true
如果不是偶数返回值是 false
JavaScript预解析(预解释/预编译)
JavaScript 是轻量级, 解释型, 弱类型 的脚本语言.
所谓的 预解析/预解释/预编译 是JavaScript程序的一种执行方式 , 在正式执行JavaScript程序之前, JavaScript会先将所有需要执行的JavaScript程序预读一遍 . 对于var 关键词声明定义的变量 和 function关键词声明定义的函数做特殊处理.
- var声明的关键词 提前调用, 结果是undefined不会报错.
JavaScript预解析执行 先预读所有的JavaScript程序代码, 对于提前调用var声明的变量 这样的操作 ,
预解析告诉JavaScript有这样的一个变量, 只是当前调用时, 这个变量还没有赋值 , 执行效果是提前调
用的var声明的变量, 执行结果是undefined.
可以简单粗暴的理解为:
将var 变量声明的语句提前到 整个程序的起始位置,
但是只是声明变量, 没有对变量赋值,
等JavaScript程序执行到 正式定义变量的语句时, 再给变量赋值数据.
-
function声明的函数提前调用, 结果是正常执行函数.
function声明的函数 提前调用, 结果是函数可以正常执行.
总结
提前调用var声明的变量, 结果是undefined
提前调用function声明的函数, 结果是正常调用
预解析/预解释/预编译 仅限于一个script标签中.
JavaScript的作用域
JavaScript变量的作用域:
作用域就是作用范围, 也就是变量的使用调用范围.
分类:
1,
全局变量/全局作用域变量/公有变量:
定义在函数之外的变量称为全局变量
任意位置都可以调用函数
函数内,函数外都可以调用
2,
局部变量 /局部作用域变量/私有变量:
定义在函数之内的变量/形参称为局部变量
默认只能在函数内部调用
函数外部无法直接调用
变量的调用 , 赋值原则
-
调用原则
就近原则 自己有这个变量, 调用自己的变量. 自己没有, 调用父级程序的变量. 父级没有, 再调用全局的变量. 都没有, 调用报错. 自己有, 但是提前调用, 执行预解析, 调用结果为undefined
-
赋值原则
就近原则: 自己有这个变量, 赋值自己的变量. 自己没有, 赋值父级程序的变量. 父级没有, 再赋值全局的变量. 都没有, 赋值语句升级为声明变量语句, 会在变量中声明一个 全局作用域 可以在函数外调用使用这个变量 (但是变量赋值没有赋值对象这样的操作禁止产生.)
数据存储的基本原理
在内存中有两个存储区域 存储数据(栈 堆)
栈:
存储 *基本数据类型*
(布尔 数值 字符串 undefined null)
是有序存储数据,
先定义的数据存储在栈的下方
后定义的数据存储在栈的上方
是变量中 直接存储数据数值的.
堆:
存储 *引用数据类型*
(函数 数组 对象)
是无序存储数据:
就是在堆中开辟一个独立的存储空间 准备存储引用数据类型的数据,
操作系统会给这个存储空间分配一个独立的空间,
(引用数据类型 变量/函数名称 存储在栈中, 其中 存储的是存储空间的 内存地址.)
JavaScript函数基本执行步骤
封装
1,在内存的堆中开辟一个独立的存储空间 , 准备存储函数程序 , 操作系统给这个存储空间分配一个内存地址
2,将函数程序以字符串形式将函数程序代码存储在存储空间中
3,将变量/函数名称存储在内存的栈中, 变量/函数名称中存储的是函数程序的内存地址
调用
1,读取栈中变量/函数名称中存储内存地址 , 通过内存地址找到堆中对应的存储空间, 调用其中存储的程序代码
2,给函数的形参赋值实参
3,对函数中的JavaScript程序执行 预解析/预编译/预解释
4,正式执行函数程序.