首页 > 其他分享 >Function-advanced

Function-advanced

时间:2023-04-24 19:34:53浏览次数:28  
标签:Function function return 函数 val 触发 divs advanced

函数进阶

1. 函数防抖

在频率触发的情况下 只有等待一定的时间才会触发 执行一次代码

特点

  • 执行之前先清除之前的即将执行操作 保证只有最后一次生效

  • 优化高频执行JS代码操作

  • 提高性能

防抖代码实现

  // 使用setTimeout实现函数防抖
  var t = null;
  document.onmousemove = function (){
    // 每次移动之前清除先前计时器
    clearTimeout(t);
    t = setTimeout(() => {
      // 等待300毫秒后执行打印语句
      console.log('鼠标移动停止300毫秒打印');
    }, 300);
  }

防抖应用场景

一些高频率事件 在被连续多次触发时 只需生效一次

  1. 搜索输入框 用户可能输入很快 在输入停止一段时间后再将请求发送

  2. 用户名 手机号 邮箱注册时验证是否符合规范

  3. 窗口大小时间resize 只需在窗口调整完成后再主席那个resize里代码 防止重复渲染 浪费性能


2. 函数节流

在频率触发的情况下 每间隔一段时间才触发一次

特点

  • 前一次存在触发执行未结束 后一次触发执行不会开始

  • 优化高频执行JS代码操作

  • 提高性能

节流代码实现

  // 利用 状态 概念
  var t = null;
  document.onmousemove = function (){
    // 当计时器处于开启状态 不再重新开启新计时器
    if(t) return;
    t = setTimeout(() => {
        console.log("函数节流每300毫秒触发一次");
        t = null;
    }, 300);
  }

节流应用场景

一些高频率事件 间隔一段时间运行一次 被连续多次触发如果处于间隔时间内无效

  1. 鼠标移动事件 如元素拖拽 获取鼠标坐标

  2. 页面中的滚动事件

  3. 频繁点击提交按钮

  4. 游戏中一些设计 如: 枪射速 每1000毫秒触发一次 每500毫秒触发一次


3. 闭包函数

概念

  • 有权访问另一个函数中的变量 并让函数不会因为执行完毕而被销毁

原理

  • 让函数定义和表达式通过另一个函数return出来 这样在里面的函数就可以访问另一个函数内的变量 当外部函数被调用时就会返回一个内部函数

作用

  • 在函数内部可以访问到外部变量
  • 避免全局变量命名空间的污染
  • 延长变量生命周期
  • 函数不会因为执行完毕而被销毁

闭包函数的创建

  // 立即执行函数使fn得到return返回值
  const fn = (function(){
    let a = 10;
    return function(){
      return a;
    }
  })()
  // fn返回值为函数 加上()调用函数得到此函数return值
  console.log(fn());  // 10

闭包函数的应用

  const divs = document.querySelectorAll("div");

  // 添加了错误索引
  for(var i = 0; i < divs.length; i++){
    divs[i].onclick = function(){
      // 因为异步原因 执行点击事件时 i已经为最大值
      console.log(i);
    }
  }

  // 添加了正确索引
  // 方法一
  for(var  i= 0; i < divs.length; i++){
    ;(function(i){
      divs[i].onclick = function(){
        console.log(i);
      }
    })(i);
  }

  // 方法二
  for(var i = 0; i < divs.length; i++){
    divs[i].onclick = (function(i){
      return function(){
        console.log(i);
      }
    })(i);
  }

  // 方法三
  for(let i=0;i<divs.length;i++){
    divs[i].onclick = function(){
      console.log(i);
    }
  }

沙箱模式

  function outer() {
    let a = 10;
    let str = 'hello world';

    // 返回一个对象
    return {
      // 对每个私有变量都准备两个函数:get用来获取,set用来修改
      getA () { return a },
      setA (val) { a = val },
      getStr (val) { return a },
      setStr: function (val) { a = val }
    }
    // 使用数据劫持中getter和setter优化
    // return {
    //   get A() {return a}
    //   set A(val) {a = val}
    //   get Str() {return str}
    //   set Str(val) {str = val}
    // }
  }

4. 函数柯里化(Curring)

将一次传入多个参数的函数 转换为多次执行 一次执行传入一个参数的函数

例如 fn(1, 2, 3) 转换为 fn(1)(2)(3)

利用闭包延长变量生命周期把每次的传递参数保存下来 也可以保存每层function中程序

  function fn1(a, b){
    return a + b
  }

  function fn2(a) {
    return function (b) {
      return a + b
    }
  }
  fn1(1, 2) // 3
  fn2(1)(2) // 3
  // 解析
  // fn2(1) 返回function(b) {return a + b} 并且这个返回的函数能访问到第一次传入的值1 并且 值1生命周期没有结束 fn2(1)(2)返回a + b = 3

标签:Function,function,return,函数,val,触发,divs,advanced
From: https://www.cnblogs.com/SpicyPeper/p/17350602.html

相关文章

  • TypeError: _vm.searchList.slice is not a function
     调用slice()的时候报错这个是因为属性只有集合里面有应该是你定义成对象了把a.slice()这个a改成数组a:[]如果a是对象a:{}就会报这个错......
  • jQuery的$(document).ready(function(){ })的疑惑的解答
    最早接触的时候也说$(document).ready(function(){})这个函数是用来取代页面中的window.onload;但是今天发现好像不是这样回事!是在做一个页面载入效果时发现的!functionwinready(){document.getElementById("loading").style.display="none";}window.onload=winready;以......
  • functional:函数对象库
    functional的基本概念和定义functional是C++标准模板库(STL)中的一个重要组件,它提供了一系列函数对象(functionobject),用于在算法中进行函数调用。函数对象可以像普通函数一样调用,但与普通函数不同的是,函数对象可以存储状态,因此可以在多次调用之间保存状态。functional中常见的......
  • golang net/rpc inject data to service function
    在golang中,net/rpc库比较牛,只需要写函数,然后使用现成的ServerCodec就可以完成rpc服务了。但是有个问题,service函数的参数都是来自客户端的,如果服务器想为某个特殊的函数注入一些配置或状态参数,就不好弄了。解决方案:修改service函数,比如原来的参数是FuncArgs结构体,现在改成t......
  • bug|初始化项目|sass-loader报错:TypeError: this.getResolve is not a function at Ob
    Modulebuildfailed:TypeError:this.getResolveisnotafunctionatObject.loader的解决npmuninstallsass-loader(卸载当前版本)[email protected]......
  • oracle function 函数
    oraclefunction的几个实例,只限入门,高手路过 --********thesimplestexampleoffunction--tip:canusesqltodirectlycallthefunctionwithinmoduleparametercreateorreplacefunctionget_customer_namereturnvarchar2isv_uservarchar2(100);begins......
  • Java JVM、JNI、Native Function Interface、Create New Process Native Function API
    JavaJVM、JNI、NativeFunctionInterface、CreateNewProcessNativeFunctionAPIAnalysis目录1.JAVAJVM2.JavaJNI:JavaNativeInterface3.JavaCreateNewProcessNativeFunctionAPIAnalysisInLinux4.JavaCreateNewProcessNativ......
  • Function的使用场景
    Function的使用场景如下所示:publicclassApiInvoke<R>{privateLoggerlogger=LoggerFactory.getLogger(getClass());public<T>Mapinvoke(Mapmap,Class<T>tClass,Function<T,R>function){returninvokeWithoutException......
  • taro3 报错 TypeError: className.split is not a function
    项目原来跑的好好的,昨天升级了几个包,引用了个UI库,然后今天上班运行项目就跑不起来了,项目是在旧的项目上升级的之前的写法<Viewkey={idx}className={["tabbar-item",isActive&&"active"]}onClick={this.switchTab.bind(this,item.key)}>{......
  • async function 报eslint 错误:Parsing error: Unexpected token function 解决方法
    asyncfunctiongetData(){这个代码报eslint错误:Parsingerror:Unexpectedtokenfunction。.eslintrc中parserOptions:{ecmaVersion:6},根据ESLint的官方文档,"ecmaVersion"配置项可以配置以下值:3:ECMAScript 3(默认值)5:ECMAScript 56:ECMAScrip......