我理解的闭包
作为一个学过编译原理的计算机科班学生,我想谈一谈我自己对javascript中闭包的理解。在编译原理课程的实验部分我们的要求是实现一个SYSY编译器(一个简化版本的C语言目标为MIPS/LLVM代码),实验的一个重要部分就是实现函数调用。在MIPS实现函数调用中比较重要的部分就是传参,前4个参数我们会利用寄存器传参,后面的参数会通过栈帧来传参(将参数压栈),不管怎样,函数调用返回后就会弹栈。但是在C语言中函数中是不允许返回一个函数的,而在javascript中可以返回一个函数。正常的情况下,如果返回正常值,那么函数中的局部变量就会直接在弹栈中丢掉了,但是在javascript中你又返回了一个函数那么需要将新的函数压栈,在这个过程中压栈肯定不能丢掉对一些局部变量的引用,同时注意每次调用原函数的局部变量都是重新产生的,也就是在内存中每个闭包函数引用的变量是不同的(如果都是同一个变量我想也不会存在内存泄漏的问题了吧)。
1234567891011121314function test(){ let a = { value: { ...
我理解的debounce和throttle
之前是在自己的项目中直接扒了一下网上的代码,最近看前端的面经中算是有了一点自己的体会吧,debounce和throttle的主要目的就是限制执行操作的频率,我个人也不太会去记住谁是谁(因为他们确实是差不多,我也不知道为什么要专门区分),网上也有很多写法,我认为最简单的写法大概如下:
12345678910111213141516171819202122232425//throttlefunction throttle(fn, delay) { let timer = null; return function(){ if(timer) return; else{ timer = setTimeout(()=>{ fn.apply(this, arguments); timer = null; }, delay); } }}//debounc ...
记面试的一道题
在淘天的一面中面试官出了这样一道题
12345678910111213/*实现Monkey, 写个Monkey函数,返回的对象提供eat和sleep两个函数,支持链式调用。具体调用方式如下所示:Monkey('Alan').eat('Banana').sleep(4).eat('Apple').sleep(5).eat('Pear')代码执行后输出:my name is AlanI eat Banana// 等待 4 sI eat Apple// 等待 5 sI eat Pear*/
我是这样写的:
123456789101112131415161718192021function Monkey(name){ console.log(`my name is ${name}`); function temp(){ } temp.prototype.eat= (food)=>{ console.log(`I ...
deep选择器的作用原理
在我使用vue3进行样式调整时,我发现有时会出现使用第三方库样式调整无效(下方以Element-plus为例)的情况,网上讲解了很多关于深度选择器的作用原理,但是一直不得要领,我想有时候你真的需要去看一眼源代码可能才能理解很多时候原本自己不理解的东西吧。
首先我想强调一点的是,这应该是使用scoped时会出现的问题,但是我们应当尽量用scoped去写样式,不能因小失大,毕竟scoped提供的隔离的作用才是我们想要的。
1234567891011121314151617181920212223242526<template> <div> <el-button plain @click="dialogVisible = true"> Click to open the Dialog </el-button> <el-dialog v-model="dialogVisible" title="Tips" width="500" :before-c ...
wsl中使用系统代理
本文主要介绍的是windows10版本的代理配置(这篇文章书写的时候,windows10还不支持镜像网络模式,不知道以后会不会支持)。在
12
VSCode插件推荐
GitlensRemote-SSHTONGYI LingmaEditorConfig for VS CodeESlintPrettier - Code formatterkoroFileHeaderTurbo Console LogTodo TreeVue - Official
前端自动化部署方式
这里主要介绍我在软件系统设计与分析使用的Github Actions部署。
为你的项目创建.github/workflows二级目录,就像这样。
在目录下新建deploy.yml文件,内容如下:123456789101112131415161718192021222324name: Frontend deployon: push: branches: - mainjobs: build: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - name: get env run: | cd NoBeiCi npm install npm run build - name: Deploy uses: cross-the-world/scp-pipeline@master with: host: ${{secrets.IP ...