Function 函数对象
- 函数:是指预定义后,可以反复使用的代码段(任务步骤清单)。(也称之为方法)
- 创建方式:
- 声明方式:
function 函数名(形参,···) {
函数体;
return 结果;
}
- 直接量方式
Var 函数名=function(形参1,···){
函数体;
return 结果;
}
- 构造函数方式
var 函数名=new Function(“形参1”,”形参2”···,”函数体 return 结果”);
- 作用域(scope)——一个 变量的可用范围
- 全局作用域:全局变量和全局函数,js任何位置都可用,但易被污染
- 函数作用域:局部变量(函数内部创建的变量,形参)和局部函数,函数调用时内部可用,不被污染,一次性
- 作用:从作用域中形成变量的使用规则,优先使用自己的,自己没有找全局,全局欸有报错。
- 特殊(全局污染):任何地方给未声明(为var)的变量直接赋值——浪费内存
- 声明提前(hoist)
- 在程序正式执行前
将声明的变量和声明的函数,集中悄悄提到当前作用域的顶部创建
但赋值留在原地,变量比函数轻
只有声明方式函数会完整提前
直接量函数,构造函数只有函数名和变量名部分会提前,赋值留在原地
- 使用:只有笔试面试,开发中尽量避免
避免:遵守先创建后使用原则,函数和变量名尽量不提前
- 按值传递:两个变量之间赋值
- 传递的是原始类型:之间不互相影响,副本
- 传递的是引用类型:变量之间相互影响,变量使用的是同一个地址值(浅拷贝)
- 预定义全局函数:提前创建好,任何位置可用
- 编码和解码
普通版
var code=encodeURL(“原文”);
var 原文=decodeURL(“code”);
加强版
var code=encodeURLComponent(“原文”);
var 原文=decodeURLComponent(“code”);
- isFinite(num):判断一个数字是否在有效范围内
3种情况为false:NaN/infinity/分母为0
- eval(str):计算字符串,脱掉字符串的衣服
- 重载(overload)
- 含义:相同的函数名,根据传入的实参的不同,自动选择对应的函数调用执行
- 问题:js中不支持重载,因为js中不允许多个同名函数,最后一个会覆盖前面的
解决:在函数内部有一个对象——arguments对象
- argunments:只能在函数调用时内部可用,自动创建,是一个类数组,专门接受所有传入的实参的对象。
- 可以做的事:
- 变相实现重载,判断arguments的不同(长度或类型),执行不同的操作,以后都不用在写形参了
- 正式开发中,有可能某些函数可以整合为一个函数——代码优化
- 匿名函数:没有名字的函数,只能使用一次就会被自动释放
- 自调: (function () { ——代替全局作用域
Console.log(1); ——全局写的代码全都可以放到自调里面
})( );
- 回调:将一个匿名函数作为实参,传递给其他函数调用
例 arr.sort(function(a,b){return a-b})
elem.οnclick=function(){}
强调:我们要认识哪些东西是回调函数?
没有自调的匿名函数就是回调函数
作用:所有的回调函数在ES6里面都可以简化为箭头函数
- 函数的执行原理
- 程序加载时:
创建执行环境栈(ESC):保存函数调用的顺序的一个数组
首先压入全局执行环境(全局EC)
全局EC引用着全局对象window,window中保存着全局变量
- 定义/创建函数
创建函数对象:封装着函数定义的内容
函数对象中定义出scope(作用域)属性:记录着函数来自的作用域
全局函数的作用域(scope)都是window
- 调用前
在执行环境栈ESC压入新的EC(函数的EC)
创建活动对象AO:保存着本次函数调用时用到的局部变量
在函数EC中添加scope chain(作用域链)引用着AO
设置AO的parent属性为函数的scope引用的对象
- 调用时
变量的使用规则:优先使用局部变量,如果局部没有才找全局
- 调用完
函数的EC会出栈,AO自动释放,局部变量也会自动释放
- 作用域链(scope chain):以EC中scope chain属性为起点,经过AO 逐级引用,形成一条链式结构称之为作用域链
作用:查找变量,优先使用局部变量,如果局部没有才找全局
- 闭包:
(一)含义:希望保护一个可以反复使用的局部变量的一种词法结构(函数结构),结合了两者(全局变量和局部变量)的优点
(二)使用:
1.两个函数进行嵌套
2.外层创建受保护的变量,外层return出内层
3.内层操作受保护的变量
(三)强调
1.判断是不是闭包,根据使用规则判断
2.外层调用几次,闭包创建几次,受保护变量复制几次
3.同一次外层函数调用,返回的时内层函数,操作的是同一个受保护的变量
(四)优缺点
优:反复使用、不被污染
缺:受保护变量永远不会释放,会导致内存泄漏
作用:防抖节流——避免DOM树频繁修改,导致页面会降低效率
三个事件之中: onmouseover oninput onresize
- 公式:
function fdjl(){
var timer;
return function(){
If(timer){ clear Timeout(timer)}; //判断,清除定时器
timer=setTimerout(function(){ //开启定时器
自己操作;
},2000);
}
var rs=fdjl
elem.on事件名=function(){rs()}