对象的遍历
for...in循环可以用来遍历对象的可枚举属性列表,但是如果遍历对象的值呢?以数组为例,我们最基础的方式就是for循环:var myArray = [1, 2, 3]; for (var i = 0; i < myArray.length; i++) { console.log(myArray[i]); } // 1 2 3事实上这种并不是真的遍历值,而是在遍历下标来获取到对应的值。ES5新增了一些数组的遍历方法,比如:forEach(..)、every(..) 和 some(..);每种方法都可以接受一个回调函数并将其应用到数组每个元素上,,唯一的区别就是它们对于回...
实现一个基于策略模式的表单校验
最近项目居然要求不能使用vue cli这种工程化极度成熟的开发方案,非常痛苦的继承了上一代的gulp打包。苦哈哈!这也就导致不能使用ts,babel的兼容处理更是极少极少的,写啥都是得想一下,特别是没有箭头函数,this的指向我都bind了不知道多少次了。这次的功能里有一个表单校验的需求,所以我想着封装一个小工具来提高书写代码的流畅度,加上之前就一直想写一个基于策略模式的实际实现,这次赶巧给碰上了。东西比较多就不直接贴代码了,我上传到github仓库了,有兴趣去看看。github:CustomValidator效果演示

执行上下文
什么是执行上下文JavaScript引擎在执行代码阶段时,通常是调用函数的时候,就会先做一些准备工作,这个准备工作被称为执行上下文,简称EC,或者也可以叫做执行环境。执行上下文也是有不同的,有三个类型:全局执行上下文:最基础的执行上下文,一个程序也只会存在一个全局执行上下文,全局上下文会生成一个全局对象,这个对象就是window,并且会将该上下文的中this绑定到该全局对象上。函数执行上下文:当函数被调用时都是产生一个新的上下文对象,不管函数是否是重复调用Eval函数执行上下文:执行在 eval 函数内部的代码也会有它属于自己的执行上下文而this是由上下文中提供的,我们可以将上下文理解...
关于this
为什么会有thisthis在JavaScript中是一个非常复制的机制,它的存在其实是为了能让我们更好的复用代码,this提供了一种更优雅的方式来隐式“传递”一个对象引用,因此可以将API设计的更加简洁且易于复用。我们举个例子:new一个构造函数,我们可以得到一个新的实例对象,这个对象会继承原型,此时,如果没有this,如何在原型方法里去访问你的新的实例对象,以及获取属性这些操作。显然是不太好做的,难道每次都把自身作为参数传递给prototype上的方法吗?显然这非常不方便,如果使用了this,this会指向这个新的实例对象,那么我们在书写代码是就会更加方便了,复用也更加简单。这个thi...
块作用域的代替方案
随着ES6的let和const的声明,我们终于可以创建完整,不受约束的块作用域,但是这个功能终究是新的功能,老设备怎么办呢,它不支持啊!所以我们现在都是使用新的语法,再打垫片(polyfill)去支持新旧设备。那么块级作用域怎么实现旧设备也能用呢?以这段为例:{ let a = 2; console.log(a); // 2 } console.log(a); // ReferenceError分析之前说过的,with和catch,你会发现只能通过使用catch的方式实现这个功能。try { throw 2; } catch (a) { console....
提升
前言到现在为止,我们应该知道作用域是做啥的了,以及词法作用域模式中,根据代码声明的位置和方式分配作用域的相关原理,。函数作用域和块作用域的行为是一样的,可以总结为:任何声明在某个作用域内的变量,都将附属于这个作用域。但是作用域中的变量标识符和其声明的位置却有一些微妙的联系。编译a = 2; var a; console.log(a);这段代码,其实会输出2;至于为什么,我们可以从编译的角度去理解。我们知道,JavaScript在运行之前会进行一次编译,其中就有词法分析,并将词法与对应的作用域进行关联,于是会将声明先提取出去,于是乎上述的var a;会被先取走并丢入作用域中去。当代码编译完...
函数作用域和块作用域
前言函数作用域和块作用域,并不是高出词法作用域的一种东西,可以将其理解为词法作用域的一些单元,如果词法作用域是房子,函数作用域和块作用域就是房间。函数作用域每个函数都会为其自身创建一个新的局部环境(函数作用域),属于这个函数的全部变量(函数内声明的),都只能在该环境范围内使用,当然也包括作用域嵌套。function foo(a) { var b = 2; // 一些代码 function bar() { // ... } // 更多的代码 var c = 3; } bar(); // ReferenceError 上述代码中,ba...
词法作用域
什么是词法作用域在上文中我们说道作用域的概念,这套规则是用来管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符名称进行变量查找。而作用域共有两种工作模型:词法作用域动态作用域词法作用域是被普遍使用的一种工作模式,也是JavaScript所使用的,而动态作用域也是有语言在使用的,比如:Bash脚本,perl。词法作用域称之为静态作用域,这个也是由他的实际原理所提现的,具体我们往下看。词法阶段在JavaScript编译时,第一个阶段就是词法分析; 简单来说,词法作用域就是定义在词法分析阶段的作用域,换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里来决定的,因此当词法分析器处...

作用域是什么
什么是作用域几乎是所有编程语言的最基本的功能之一,就是能够存储变量的值,并且后续能够对这个值进行访问和修改,这种能力被称之为状态。如果没有状态这个概念,程序的使用会受到很大的限制,虽然没有状态也能执行一些简单的任务。变量的引入会有几个有意思的问题:变量存储在哪里?程序如果找到它们?解决这些问题的方式就是设计一套良好的规则来存储变量,并且之后也可以很方便的找到这些变量,这套规则被称之为作用域。编译原理JavaScript在运行的时候,如何创建一个变量,如何获取一个变量的值,都是通过作用域来实现的,可以将作用域理解为一个工具,往里面存东西,从里面拿东西等一系列操作。js的完整运行有三个模块:...
实现一个自定义虚拟滚动条
根据element框架的el-scrollbar来实现的,根据官方源码自己写了一版,用于了解该功能的实现。要点:通过margin的负值以及不定宽高的父级元素verflow: hidden实现隐藏滚动条真实的滚动条被隐藏后实现一个自己的滚动条(点击滚动滑轨滚动和拖拽滑块滚动)实现一个div的resize事件监听来动态更新虚拟滚动条的大小其中最难的就是拖拽滑块滚动,那个算法真的看不懂,反正照抄了,由于不是很有时间研究,所以没有对移动端的touch事件进行兼容。参考文章: Element-ui el-scrollbar 源码解析本人仓库:CustomScrollBar效果展示:总结:个人的实现...

vue cli3-cli4 打包后项目在二级路径的方法
默认情况vue的build打包,都是基于根路径来进行的,但是,如果我们将打包的文件放置再二级目录,就会导致文件无法加载,页面空白。原因有两个:路由路径无法正确匹配资源文件路径错误下面我们就来讲讲做法路由配置在路由实例的创建时,我们常常会看到一个base选项,内容如下:const router = new VueRouter({ mode: 'history', base: process.env.BASE_URL, routes })base官方有很明确是解释:类型: string 默认值: "/"应用的基路径。例如,如果整个单页应用服务在 /app/ 下...

url文件的下载
前言以前写过一篇《目前前端下载文件的最佳实践》的文章,虽然这个文章是我经过工作实践得出得,但是直到今天我才发现,原来不止如此,根据我目前的知识,可以把文件下载分为两类:接口返回文件流文件下载地址之前分析的文章仔细一想,其实都在做一个事情:读取文件流再手动转文件进行本地下载首先我们需要知道,我们的a链接下载其实并没有问题,本来是不需要读取文件流的,但是后端对头信息的了解不多,导致下载文件的链接是一个预览的头信息,这就导致我们a链接无法直接通过点击直接下载,反而是直接打开了这个文件。这带来的结果就是我们会认为图片啊,pdf这些浏览器可以直接打开的文件,并不会触发下载,而是预览,因为我们很少去...

Nginx默认不支持带下划线的头信息
前言最近国庆了,由于主要计划被迫放弃,所以只能走点次要计划,就是将个人全栈开发的书签系统移动到其它服务器上,主要还是因为财力问题,无法供给多台服务器,腾讯云也没有什么好活动,全是老用户与狗不得参与系列。无奈的搬运,其中最简单的是项目打包带走,数据库的还原,站点的配置,其中我就遇到了个贼奇葩的问题,就是我的头信息总是获取不到。一开始我是以为是我的反代服务的问题,因为是nodejs的后端服务,如果想要通过域名访问api就不得不通过反代的方式来使用。反代是将a的请求接受后自己再发给真实服务,然后将真实服务的返回再返回给a,其中我们知道一个xhr请求是有很多参数的,其中header头信息也是一种...

使用howler.js封装一个网页游戏音乐管理器
踩坑指南虽然howler.js说他可以自动感知然后自动播放,事实上没什么软用,所以我们还需要自己去配置一下触发器。监听一个全局的click事件之类的。虽然howler.js说可以自动降级到h5播放,但是实际测试无法在安卓4.4中进行播放,但是个人测试,如果你使用一个audio元素,是可以播放的,但是这样就需要自己去手动封装一个基于audio元素的播放管理,项目赶的很,实在没有多余的时间去研究这个,特别是音效的播放,还是专业的库处理比较好,所以暂时对于安卓4.4的兼容是没法做到的。官方对于这个问题也是很模糊,找不到解决办法。howler.js在文档中找了半天,也没看到官方提供动态替换资源的...
实现一个点击空白区域关闭显示的自定义指令
typescriptimport type { DirectiveBinding } from "vue"; export default { bind(el: HTMLElement, binding: DirectiveBinding<Function>) { //声明一个给document绑定的事件 function documentClick(event: Event) { const target = event.target as unknown as Node; if (el.contains(t...
使用vue2.7的一些踩坑事项
eslint校验的一些问题(暂时无解)在初始化项目时勾选了eslint校验之后,升级vue 2.7版本后,eslint-plugin-vue这个插件需要升级到9+版本,我目前使用的版本是:"eslint-plugin-vue": "^9.4.0"具体的一些可以参考官方提供的2.7升级指南:2.7日志官方居然把这个写在了变更日志里面,按道理最好官方的文档上也有一份说明的,但是目前没有。虽然eslint的依赖更新到新版后确实解决了一些项目启动报错的问题,但是有时候我们的SFC单文件组件开发的时候,template中的一些变量绑定还是会出现波浪线警告,这...
实现一个自动高度的输入框
前言大概在上个月的时候我就看了对应的一些资料,但是一直拖着,因为这个功能其实vue的框架就有提供,比如element ui的input组件,它的这个功能叫自适应文本域,属性为autosize。所以本文也不过多讲解具体实现,主要还是它的原理层的东西。这个功能可以用在哪呢?比如移动端的聊天输入框的高度判断,拿我们的QQ来讲,在没有内容的时候它就只有1行的高度,如果内容过高,就会自动变高,然后也会有一个max的最大高度阈值,这个高度一般是几行,比如最大6行高度,多了就滚动条处理。那么就开始吧!最基本的实现变高原理其实非常简单,假设我现在有一个textarea元素用于用户的输入,然后我希望它在用...

解决Cocos Creator单屏开发改动脚本文件后还需要切换到Cocos Creator以触发脚本编译
问题起源可能Cocos Creator软件的开发人员认为每个开发者都是有两个电脑屏幕的(苦笑);它的脚本检测逻辑是:当你改动完脚本文件后,切换到Cocos Creator面板,此时才会触发预览更新,如果你是双屏的话,就不用切换,一个屏幕打开Cocos Creator,一个屏幕打开vscode,然后vscode保存后就会自动更新,此时切换到浏览器预览,一切都是那么的正常,前提你得有两块屏幕。非常蛋疼!!!这真是一个糟糕的体验!如果我们是单屏,你vscode改动脚本保存后,还得切换到Cocos Creator软件上,然后再切到浏览器去查看,超恶心有没有,怎么会有这种体验,都2022年了,文件...

让typecho支持特殊字符
起因由于最近在了解前端js中length不准的问题,其中文章带有一些特殊字符,而typecho和mysql都只是支持UTF-8字符,但是这个utf-8并不是真正意义上的utf-8,它最多支持3个字节的内容,也就是24bit,而我文章中的特殊字符是需要4个字节来存储的,这就导致文章无法正常的展示和保存。这个特殊字符和现在移动端常用的emoji表情差不多,emoji也是一种特殊字符,所以该教程同样适用于如何让typecho支持emoji表情。教程打开宝塔的phpmyadmin -> 找到typecho的数据库 -> 操作 -> 滑动到最底部找到排序规则 -> 选择ut...

为什么length不准
前言这个问题在最近经常被刷到,虽然我知道怎么解决这个问题,但是为什么会这样,其实并不太明白,所以这次特此开一篇文章讲讲为什么length获取字符位数会不准的问题,以及我们的解决办法。"𠮷".length //2 "💩".length //2𠮷与吉利的吉是一个意思,𠮷是异体写法,古文中会出现。按照我们的认知,上述的length输出应该是1才对,但事实上却是2。计算机是如何存储字符的早期的ASCII字符集在计算机中,所有的数据存储最终都是二进制,如何正确的存储及其识别字符,做法就是定制一个编码规则,让每个字符都由一个个数字来表示,这些数字被...

2022下半年计划
今晚心潮澎湃写下了下半年的计划,加油搞下去吧,任务不分先后,加油,下半年[ ] 博客主题更新v2.0[ ] nestjs[x] vue3 快速入门文章[ ] pinia 入门文章[x] 看书《你不知道JavaScript》上[x] 看书《你不知道JavaScript》中[ ] 看书《你不知道JavaScript》下前端功能:[x] 虚拟滚动条[ ] 虚拟列表[ ] 上拉刷新[ ] 下拉刷新[x] autosize input[x] length[x] 复制功能[x] uuid总结下半年这几个月也是攒足了劲了,好多东西混在一起,随着时间有些东西都忘了,哈哈。。。还好写了博客,回头用的时候来...

啊啊
学习
疯子
学习 学习
紫慕爱摸鱼
前来学习。
威力宝宝
学习!!
闹心
厉害
闹心
哇厉害