JavaScript
函数
将完成某一特定功能的代码封装起来,并且可以重复调用的代码块。
- 一次封装多次使用
- 根据不同的参数返回不同值
- 代码简洁,便于维护
创建方式
-
具体函数
function 变量名(){ } -
匿名函数/字面量
var 变量名=function(){ } -
实例化构造函数
var 变量名=new Function()
调用方式
-
通过括号的方式
具体函数调用:函数名() 匿名函数调用:变量名() 实例化结构函数调用:变量名() -
自调用
//第一种 ( function(){}) () //第二种 (function( ){ }()) //第三种 ! function(){}() -
通过事件的方式调用
<div class="box" onlick="fn()"> </div> <script> function fn(){ alert(1); } </script>
注意事项
- 函数名相同,后面的会把前面的覆盖掉
- 具名函数可以在前后调用,匿名函数只能在后面调用
- 在不同script代码块种,具名函数匿名函数只能在后面代码块调用不能在前面script代码块调用(报错 is not defind)
严格模式对函数也有一些限制:
- 函数不能以 eval 或 arguments 作为名称;
- 函数的参数不能叫 eval 或 arguments;
- 两个命名参数不能拥有同一个名称。
参数
-
实参:函数调用的时候 传入 的参数
-
形参:函数声明的时候 接受 的参数
function fn(n){ console .log(n) } fn(100)参数详解
-
参数可以是任意数据类型
-
参数个数
- 形参和实参一一对应
- 形参>实参,多余的是undefined
- 形参<实参
- 函数声明自动创建arguments对象 arguments 只能用在函数内部 外部报错 arguments 用来存储参数信息 下标:排序
function fn(){ console.log(arguments); console.log(arguments[0]);//10 console.log(arguments[1]);//true console.log(arguments[2]);//张三 console.log(arguments.length);//参数个数 } fn (10,true,"张三")返回值
需要对函数结果进行处理的时候需要用到函数返回值。
return 需要返回的值
终止当前函数
返回值可以是任意的数据类型
任何一个函数都有返回值
如果一个函数没有返回值,默认返回undefined
如果函数返回多个值,返回最后一个
function fn(){ return 100; } var reult=fn(); console.log(result);//100
-
运行环境
- 宿主环境:浏览器
- 执行环境:
- 全局
- 局部(函数)
作用域
作用域即一段代码的范围
- 全局变量:在全局变量下用 var 声明的变量或者函数
- 局部变量:在函数环境下声明的变量或者函数
作用域链
在使用变量或者函数的时候,会在当前环境中去找,
当前环境找不到回去上一个环境中去找,上一个找不大到再上一个,直到找到全局变量window为止,找不到报错,函数
undifent
预解析
代码 执行顺序
- 从上到下
- 解析过程中遇到全局变量或者全局函数提前解析到内存中
- 函数内部程序什么时候调用什么时候执行
- 如果遇到多个script 代码块按照如上顺序执行
回调函数
回调函数。1
回调函数会造成回调地狱
function fn(callback) //callback 就是aa
//既然是函数就能用()调用
//调用的同时有可以传参,cc函数又是回调函数
var result = callback(10, function cc(){});
console.log( result ) // result 就是aa的返回值
}
function aa(){};
fn (aa)
递归
在函数内部调用自己,但是必须要有一个终止条件,
否则会造成堆栈溢出
案例:阶乘
function jieCheng(n){
if(n<=1){
return 1;
}
else return n * jieCheng(n - 1)
}
alert(jieCheng(prompt("你要求几的阶乘")) )
闭包函数
闭包(closure)是定义在一个外部函数内部,并且能够访问外部函数中局部变量、参数、其他内部函数的函数,内部函数在包含它的外部函数之外被调用就形成闭包
闭包特点:
- 函数内部嵌套函数
- 函数内部可以访问外部函数中的变量或者参数
- 内部函数在外部函数被调用
典型的闭包:
- 在一个函数内部返回一个函数
- 在函数内部 函数自调用
闭包缺点:常驻内存,会增大内存使用量,使用不当很容易造成内存泄漏
一般函数执行完必后,局部活动对象就会被销毁,内存中仅仅保存全局作用域。而闭包函数常驻内存,变量不会被销毁。
闭包好处:
-
避免全局变量污染
-
私有成员的存在
function fn1(n){ return function (num){ return n*num ; } } console.log(fn1(3)(2)); /
内置顶层函数
ECMAScript自带的全局环境下的函数
- Number()将任数据类型转换成数字
- parseInt()将任数据类型转换成整数
- parseFloat()将任数据类型转换成浮点数
- String()将任数据类型转换成字符串
- Boolean()将任数据类型转换成布尔类型
- isNaN()检测是否能转换为数字可以false 不可以 true
- eval("js代码")解析字符串js代码
数据类型转换
-
强制数据类型
- Number()将任数据类型转换成数字
- parseInt()将任数据类型转换成整数
- parseFloat()将任数据类型转换成浮点数
- String()将任数据类型转换成字符串
- Boolean()将任数据类型转换成布尔类型
-
隐式数据类型转换
算术运算符,逻辑运算符,关系运算符,if分支,三元运算符......