Function-advanced
函数进阶
1. 函数防抖
在频率触发的情况下 只有等待一定的时间才会触发 执行一次代码
特点
执行之前先清除之前的即将执行操作 保证只有最后一次生效
优化高频执行JS代码操作
提高性能
防抖代码实现
// 使用setTimeout实现函数防抖
var t = null;
document.onmousemove = function (){
// 每次移动之前清除先前计时器
clearTimeout(t);
t = setTimeout(() => {
// 等待300毫秒后执行打印语句
console.log('鼠标移动停止300毫秒打印');
}, 300);
}
防抖应用场景
一些高频率事件 在被连续多次触发时 只需生效一次
搜索输入框 用户可能输入很快 在输入停止一段时间后再将请求发送
用户名 手机号 邮箱注册时验证是否符合规范
窗口大小时间resize 只需在窗口调整完成后再主席那个resize里代码 防止重复渲染 浪费性能
2. 函数节流
在频率触发的情况下 每间隔一段时间才触发一次
特点
前一次存在触发执行未结束 后一次触发执行不会开始
优化高频执行JS代码操作
提高性能
节流代码实现
// 利用 状态 概念
var t = null;
document.onmousemove = function (){
// 当计时器处于开启状态 不再重新开启新计时器
if(t) return;
t = setTimeout(() => {
console.log("函数节流每300毫秒触发一次");
t = null;
}, 300);
}
节流应用场景
一些高频率事件 间隔一段时间运行一次 被连续多次触发如果处于间隔时间内无效
鼠标移动事件 如元素拖拽 获取鼠标坐标
页面中的滚动事件
频繁点击提交按钮
游戏中一些设计 如: 枪射速 每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的更多相关文章
- C#编程经验-function advanced params
function advanced params:outrefparamsnot useful,to use them is a burden,so i dont use themdefects:ou ...
- 【cocos2d-js公文】十八、Cocos2d-JS v3.0物业风格API
1. 新的API风格 我们直接来看看你能够怎样使用Cocos2d-JS v3.0: 曾经的API 新的API node.setPosition(x, y); node.x = x; node.y = ...
- 通过百度echarts实现数据图表展示功能
现在我们在工作中,在开发中都会或多或少的用到图表统计数据显示给用户.通过图表可以很直观的,直接的将数据呈现出来.这里我就介绍说一下利用百度开源的echarts图表技术实现的具体功能. 1.对于不太理解 ...
- machine learning(11) -- classification: advanced optimization 去求cost function最小值的方法
其它的比gradient descent快, 在某些场合得到广泛应用的求cost function的最小值的方法 when have a large machine learning problem, ...
- [Javascript] Advanced Function Scope
Something like 'for' or 'while', 'if', they don't create a new scope: ,,]; ; i < ary.length; i++) ...
- sleep function error ("Advanced Programming in the UNIX Environment" Third Edition No.374)
测试证明代码: #include <unistd.h> #include <fcntl.h> #include <time.h> #include "ap ...
- 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 ...
- 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 ...
- Advanced Awk for Sysadmins
转:http://www.linuxforu.com/2011/06/advanced-awk-for-sysadmins/ By Vishal Bhatia on June 1, 2011 in H ...
- Advanced Configuration Tricks
Advanced Configuration Tricks Configuration of zend-mvc applications happens in several steps: Initi ...
随机推荐
- Python - XSS-Attribute
参考资料:https://owasp-skf.gitbook.io/asvs-write-ups/cross-site-scripting-attribute-xss-attribute/kbid-3 ...
- NET Core 部署IIS 碰到得问题解决(内托管模式超时、不允许得请求谓词、直接请求无响应、拒绝服务405)
web.config 配置说明 典型的web.confg 配置. 注意其中hostingModel模式和requestTimeout 进程内托管需要注意使用单独的应用程序池: 请求超时默认5分钟,出错 ...
- .NET 5 WPF 配置文件变动 程序自动刷新 (reloadOnChange)
using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; using Microsoft.Extens ...
- Vue的Component name报错
问题描述: Component name "xxxxx" should always be multi-word.eslintvue 解决方案: 在项目目录中找到 .eslintr ...
- 微信小程序 入门总结篇
页面生命周期 Page({ /** * 页面的初始数据 */ data: { }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { }, ...
- 基于工业4g网关的危化品运输车监控方案
工业的发展立足于各种各样原材料的加工和应用,而其中就包括一些油料.化学品和易燃易爆货物,针对此类货物的运输,需要着重关注其安全性和稳定性,否则就容易造成严重的人身和财产损失.得益于物联网技术的发展,现 ...
- git的回退以及合并,删除什么的
有时候不小心合并了别的分支中的commit.我们需要回退某些提交记录.可以通过reset来操作,reset 会回退到指定commit.这种方式会删除记录,我们最好使用revert命令来操作 git r ...
- Oracle数据库安装时,安装报错ins_emagent.mk
安装oracle数据库过程中,通过图形界面安装,出现ins_emagent.mk报错提示 解决方法 修改$ORACLE_HOME/sysman/lib/ins_emagent.mk,将$(MK_EMA ...
- Android笔记--报错AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY in "create table if not exists user_info(导致APP闪退)
问题描述 每次一运行,APP程序必定闪退,百度了发现,闪退问题绝大多数就跟sql语句有关: 看到控制台报出这样的错误: 百度发现,我忘记了最初的知识点: 在表里面,自动递增是在数据类型为Integer ...
- Linux & 标准C语言学习 <DAY6>
一.数组 什么是数组:变量的组合,是一种批量定义相同类型变量的方式 定义: 类型名 数组名[数量]; int arr[5]; 注意:数 ...