函数进阶

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-advanced的更多相关文章

  1. C#编程经验-function advanced params

    function advanced params:outrefparamsnot useful,to use them is a burden,so i dont use themdefects:ou ...

  2. 【cocos2d-js公文】十八、Cocos2d-JS v3.0物业风格API

    1. 新的API风格 我们直接来看看你能够怎样使用Cocos2d-JS v3.0: 曾经的API 新的API node.setPosition(x, y); node.x = x; node.y = ...

  3. 通过百度echarts实现数据图表展示功能

    现在我们在工作中,在开发中都会或多或少的用到图表统计数据显示给用户.通过图表可以很直观的,直接的将数据呈现出来.这里我就介绍说一下利用百度开源的echarts图表技术实现的具体功能. 1.对于不太理解 ...

  4. machine learning(11) -- classification: advanced optimization 去求cost function最小值的方法

    其它的比gradient descent快, 在某些场合得到广泛应用的求cost function的最小值的方法 when have a large machine learning problem, ...

  5. [Javascript] Advanced Function Scope

    Something like 'for' or 'while', 'if', they don't create a new scope: ,,]; ; i < ary.length; i++) ...

  6. sleep function error ("Advanced Programming in the UNIX Environment" Third Edition No.374)

    测试证明代码: #include <unistd.h> #include <fcntl.h> #include <time.h> #include "ap ...

  7. CAST function should support INT synonym for SIGNED. i.e. CAST(y AS INT)

      Login / Register Developer Zone Bugs Home Report a bug Statistics Advanced search Saved searches T ...

  8. Emiller's Advanced Topics In Nginx Module Development

    Emiller的Nginx模块开发指南 By Evan Miller DRAFT: August 13, 2009 (changes) 翻译:Kongch @2010年1月5日 0:04am -- 2 ...

  9. Advanced Awk for Sysadmins

    转:http://www.linuxforu.com/2011/06/advanced-awk-for-sysadmins/ By Vishal Bhatia on June 1, 2011 in H ...

  10. Advanced Configuration Tricks

    Advanced Configuration Tricks Configuration of zend-mvc applications happens in several steps: Initi ...

随机推荐

  1. CAS无锁机制

    1. 背景 传统Synchronized锁:悲观,如果没有获取到锁的情况下,会让当前线程变为阻塞的状态,释放CPU执行权,效率非常低. 乐观锁(自旋):本质上没有锁,没有死锁现象,而且效率比较高,不会 ...

  2. 性能工具---JConsole基于JMX的可视化监视、管理工具

    与visualvm类似: JConsole: (Java Monitoring and Management Console),一种基于JMX的可视化监视.管理工具 VisualVM:(All-in- ...

  3. 泛型 ? extends E ? super E的区别

    package cn.itcast.generic; import java.util.ArrayList;import java.util.Collection; public class Supp ...

  4. uni-app使用Sqlite

    step2:封装常用操作(未对事务进行封装 HTML5+ API Reference (html5plus.org)) // //打开数据库 function openDb(name,path) { ...

  5. Windows11右键改Win10

    Win11改Win10右键模式 1.以管理员身份运行CMD控制台 2.在控制台中输入下列代码后回车执行 reg add "HKCU\Software\Classes\CLSID\{86ca1 ...

  6. 推荐2020年最好用的JavaScript代码压缩工具

    今天就为大家分享一篇关于推荐2020年最好用的JavaScript代码压缩工具,觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随来看看吧 JavaScript 代码压缩是指去除 ...

  7. 在CentOS中搭建NFS

    概述 NFS是一款经典的网络文件系统,在Linux上我们可以通过创建一个NFS服务在不同的服务器之间共享磁盘文件,而不用在多个服务器之间进行不断的拷贝复制,麻烦且浪费存储空间.在k8s中我们也可以使用 ...

  8. ngix安装与使用

    主要是nginx的安装使用, 至于原理 1. 安装nginx(以及两个tomcat) 2. 使用nginx(测试负载均衡) 想要搭建的测试环境, 1.两个tomcat, 端口分别是80和8090(因为 ...

  9. operator简介

    原理 operator 是一种 kubernetes 的扩展形式,利用自定义资源对象(Custom Resource)来管理应用和组件,允许用户以 Kubernetes 的声明式 API 风格来管理应 ...

  10. 树状分级框架UI实例

    树状分级框架UI实例:(内容参考https://zhuanlan.zhihu.com/p/108485875) #coding:utf8 #!/usr/bin/env python #@author: ...