lodash
中的节流函数
throttle
和防抖函数
debounce
官方文档是这样定义的:
_.throttle(func, [wait=0], [options=])
func (Function): 要节流的函数。
[wait=0] (number): 需要节流的毫秒。
[options=] (Object): 选项对象。
[options.leading=true] (boolean): 指定调用在节流开始前。
[options.trailing=true] (boolean): 指定调用在节流结束后。
(Function): 返回节流的函数。
_.debounce(func, [wait=0], [options=])
func (Function): 要防抖动的函数。
[wait=0] (number): 需要延迟的毫秒数。
[options=] (Object): 选项对象。
[options.leading=false] (boolean): 指定在延迟开始前调用。
[options.maxWait] (number): 设置 func 允许被延迟的最大值。
[options.trailing=true] (boolean): 指定在延迟结束后调用。
(Function): 返回新的 debounced(防抖动)函数。
把一个带参数的函数转化为节流和防抖版本的,如何保证传参可行。在使用Vue开发时,如何转换节流和防抖函数。现有的情形描述一下就是,有个button的
click
事件,目前
click
事件的回调函数是带参数的,而且参数不能省,如何将这个回调函数转换为节流或者防抖版本的。
<el-button @click="handleOnSale(scope.row)"/>
async handleOnSale(row) {
if (row.isOnShelf === 0) {
try {
await this.$confirm('确定要上架吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
} catch (e) {
console.log(e)
return
try {
const topic = Object.assign({}, { isOnShelf: 1, topicKey: row.topicKey })
const res = await this.$api.knowledge.updateTopic(topic)
if (res && res.code === 0) {
this.$message({
message: '上架成功',
type: 'success'
setTimeout(() => {
this.pagination.current = 1
this.tableReload(this.formSearch)
}, 2000)
} catch (e) {
console.log(e)
if (row.isOnShelf === 1) {
try {
await this.$confirm('确定要下架吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
} catch (e) {
console.log(e)
return
try {
const topic = Object.assign({}, { isOnShelf: 0, topicKey: row.topicKey })
const res = await this.$api.knowledge.updateTopic(topic)
if (res && res.code === 0) {
this.$message({
message: '下架成功',
type: 'success'
setTimeout(() => {
this.pagination.current = 1
this.tableReload(this.formSearch)
}, 2000)
} catch (e) {
console.log(e)
要想使用节流或者防抖函数,需要传递一个纯函数,即不带参数的函数(其实是不带括号的函数),这里需要指出带参和不带参(不带括号)的区别:
function foo(){}
function bar(a,b){}
console.log(typeof foo)
console.log(typeof bar)
console.log(typeof bar(1,2))
通过typeof
运算,可以看出,如果一个函数是带参的,会判断为undefined
,原理是函数本质是一个地址,函数调用是一个返回结果,如果一个函数带参(其实就是带括号了,参数没有都可以)了,会解释为函数调用,如果函数没有返回值,typeof
就是undefined
,如果有返回值,typeof
就是返回值的类型
function bar(a,b){return false}
console.log(typeof bar(1,2))
那如果函数必须要带参数,如何使用节流和防抖呢?
其实,只要传递函数名称就可以了,不要带参(带括号)就行了。譬如:
function bar(a,b){return false}
let throttleBar = _.throttle(bar,2000,{leading:true,trailing:false})
let debounceBar = _.debounce(bar,2000,{leading:true,trailing:false})
这样throttleBar
、debounceBar
就是节流和防抖版本的bar函数了,调用时,
throttleBar(1,2)
debounceBar(1,2)
正如我们现实情况遇到的,绑定的click
事件回调函数,里面涉及异步操作,特别的我们使用了async
语法,那么回调函数本质是一个promise function
而不是function
,而 _.throttle(func, [wait=0], [options=])、 _.debounce(func, [wait=0], [options=])都要求入参func
为function
,所以需要将promise function
类型转换为function
类型,为此可以想到这样做:
handleOnSaleFun(row) {
this.handleOnSale(row)
另外,节流和防抖函数转换,需要提前转换,也就是在绑定回调函数时,回调函数需要提前转换为节流和防抖版本,否则节流和防抖不会生效。
<el-button @click="_.debounce(handleOnSaleFun, 2000, { leading: true, trailing: false })"/>
这样的方式不行,因为参数必须要传递
<el-button @click="_.debounce(handleOnSaleFun, 2000, { leading: true, trailing: false })(scope.row)"/>
这样也不行,事件绑定回调也是纯函数,不是函数调用
<el-button @click="debounceHandleOnSaleFun(scope.row)"/>
computed: {
debounceHandleOnSaleFun() {
return _.debounce(this.handleOnSaleFun, 2000, { leading: true, trailing: false })
利用计算属性得到一个防抖或者节流版本的函数,这样的函数其实就是纯函数,在事件的回调函数中,传递参数不会解释为函数调用,而是带参的函数,这样就实现了带参函数的防抖和节流。
非前端开发工程师,往往因为缺少css编写经验而很难写出组织良好且易于维护的css代码项目
Less介绍
Less是一门css预处理语言,它扩展了css的动态特性。在css的基础上引入了变量、运算、函数等功能。
常见的预处理器:Sass、Less、Stylus
Less安装
首先需要安装node.js
使用npm install -g less安装less
使用less -v
Python函数编程中的map(func, seq1[, seq2,…]) 函数是将func作用于seq中的每一个元素,其中seq须是可迭代对象,并将所有的调用的结果作为一个list返回。如果func为None,作用同zip()。
本文参考自:Python中map()函数浅析一文,感谢精彩分享。
下面举得例子来帮助我们更好的理解这个工作过程:
1、对可迭代函数’iterable’中的每一个元
在 Python 中,函数是一种可重用的代码块,用于执行特定的任务或操作。函数可以接受输入参数,并返回输出结果,从而实现模块化和封装性编程的目的。""""""其中,def是定义函数的关键字,是函数的名称,parameters是函数的参数列表,用圆括号包裹,多个参数之间用逗号分隔,如果没有参数,则留空即可。函数名称和参数列表组成了函数的签名(signature),用于唯一识别和调用该函数。函数的主体部分由冒号和缩进的代码块组成,通常包含一些语句和表达式来完成具体的计算或操作。
Hive内置函数一 Hive函数分类二 字符函数二 类型转换函数和数学函数三 日期函数四 集合函数五 条件函数六 聚合函数和表生成函数6.1 聚合函数6.2 表生成函数:输出可以作为表使用
一 Hive函数分类
从输入输出角度分类
标准函数:一行数据中的一列或多列为输入,结果为单一值
聚合函数:多行的零列到多列为输入,结果为单一值
表生成函数:零个或多个输入,结果为多列或多行
从实现方式分类
内置函数
自定义函数
UDF:自定义标准函数
UDAF:自定义聚合函数
UDTF:自定义表生成函数
__func__标识符 __func__是C99标准里面预定义标识符, 它是一个static const char[], 会在每一个使用__func__的函数里隐式定义.下面是ISO9899里的例子#include void myfunc(void){ printf("%s/n", __func__); /* ... */}输出: myfunc 据我所知好像只
函数的定义以关键字def开头,后面接函数名称和圆括号。括号中放入函数需要的参数。通过冒号和缩进控制函数内容。def 函数名(参数) : 函数体在学习一门语言时,我们最先学会的是如何输出Hello world。那么,我们的第一个函数也就从最简单的输出Hello world开始。') hello()可以看到,我们调用了我们定义的hello函数,函数执行了其中的print语句。这里我们定义一个可以计算两个数之和的函数add,可以先运行一下看看。3函数完美地计算出了1加2的值。
主要有cv2.line()//画线, cv2.circle()//画圆, cv2.rectangle()//长方形,cv2.ellipse()//椭圆, cv2.putText()//文字绘制
img:源图像
color:需要传入的颜色
thickness:线条的粗细,默认值是1
linetype:线条的类型,8 连接,抗锯齿等。默...
函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()
任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始,并且缩进。
return [表达...