Function

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对象

  1. argunments:只能在函数调用时内部可用,自动创建,是一个类数组,专门接受所有传入的实参的对象。
  2. 可以做的事:
  1. 变相实现重载,判断arguments的不同(长度或类型),执行不同的操作,以后都不用在写形参了
  2. 正式开发中,有可能某些函数可以整合为一个函数——代码优化
  • 匿名函数:没有名字的函数,只能使用一次就会被自动释放
  • 自调:  (function () {               ——代替全局作用域

                    Console.log(1);          ——全局写的代码全都可以放到自调里面

               })( );

  • 回调:将一个匿名函数作为实参,传递给其他函数调用

 例  arr.sort(function(a,b){return a-b})

     elem.οnclick=function(){}

强调:我们要认识哪些东西是回调函数?

      没有自调的匿名函数就是回调函数

作用:所有的回调函数在ES6里面都可以简化为箭头函数

  • 函数的执行原理
  1. 程序加载时:

     创建执行环境栈(ESC):保存函数调用的顺序的一个数组

     首先压入全局执行环境(全局EC)

     全局EC引用着全局对象window,window中保存着全局变量

  1. 定义/创建函数

     创建函数对象:封装着函数定义的内容

     函数对象中定义出scope(作用域)属性:记录着函数来自的作用域

     全局函数的作用域(scope)都是window

  1. 调用前

     在执行环境栈ESC压入新的EC(函数的EC)

     创建活动对象AO:保存着本次函数调用时用到的局部变量

     在函数EC中添加scope chain(作用域链)引用着AO

     设置AO的parent属性为函数的scope引用的对象

  1. 调用时

     变量的使用规则:优先使用局部变量,如果局部没有才找全局

  1. 调用完

     函数的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()}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值