百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

js(=>) 箭头函数的实际应用(js箭头函数作用域)

toyiye 2024-08-24 00:27 4 浏览 0 评论

昨天在开发过程中遇到个问题,事情这样的。

项目中有个页面基于vue做的 中间用到了el-upload这个组件进行上传操作。 原来的上传过程中,文件限制个数为5个

												<el-upload
                                list-type="picture-card"
                                action
                                :http-request="uploadOss"
                                accept=".bmp, .jpg, .png"
                                :limit="5"
                                :disabled="pictureList40.length >5"
                                :on-exceed="limitMax"
                                :before-upload="beforeUpload"
                                :on-preview="handlePreview"
                                :on-remove="(file, fileList) => {handleRemove(file, fileList, 4)}"
                                :file-list="pictureList40"
                                :data="{index:4}" >
                            <i class="el-icon-plus avatar-uploader-icon"></i>
                        </el-upload>

原有limitMax的定义如下:

limitMax() {
    this.$message.warning("图片最多上传5张");
},

考虑到新增的这个上传组件需要限制为10张图 于是将limitMax()改成如下

limitMax(limit) {

this.$message.warning("图片最多上传"+limit+"张");

}

并将 :on-exceed="limitMax" 改成 :on-exceed="limitMax(10)",:limit="5"改成了 :limit="10",:disabled="pictureList40.length >10" 结果运行出现页面一加载就弹出文件个数限制提示框 如下图:


这就奇怪了 明明我都还没有上传 文件 为啥就触发了文件个数限制回调呢。由于本人是后端开发,也只会些jq操作,对vue操作也就停留在个 new vue基础 上,于是叫来了这边 的前端工程师。

前端大佬一顿嗨操作,启动好几次后,仍旧页面一加载出现这个提示框。只见他摸着头,慢慢打开浏览器在百度输入框输入 el-upload 迅速回车 一顿鼠标狂点找到了如下个文档:


看完后 他略有所思的将limitMax(limit) 函数改成了

limitMax(files, fileList, limit) {
    this.$message.warning("图片最多上传" + limit + "张");
} 

然后将:on-exceed="limitMax(10)" 改成了 :on-exceed="(files, fileList) => limitMax(files, fileList, 10)" 然后快速重启应用。

奇迹出现了,页面加载没有出现提示框了。

前端工程师潇洒而去...

晚上下班想到这个事,觉得对这个=>感到陌生,自己也只对->这个比较熟悉(本人后端主要语言是Java) Java中有这种操作,

BiConsumer bi=(x,y)->System.out.println(x);

传说中的函数式编程。

于是想到是不是=>也是和->一样的函数定义操作(代替匿名函数,使得代码更加简洁有效,其实本人觉得更加晦涩,可能jdk7玩久了吧)。

于是我也开启了前端工程师的骚操作,打开浏览器 翻出百度...

ES6标准新增了一种新的函数:Arrow Function(箭头函数)。

为什么叫Arrow Function?因为它的定义用的就是一个箭头:

x => x * x

上面的箭头函数相当于:

function (x) {
    return x * x;
}

箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式,一种像上面的,只包含一个表达式,连{ ... }和return都省略掉了。还有一种可以包含多条语句,这时候就不能省略{ ... }和return:

x => {
    if (x > 0) {
        return x * x;
    }
    else {
        return - x * x;
    }
}

如果参数不是一个,就需要用括号()括起来:

// 两个参数:
(x, y) => x * x + y * y

// 无参数:
() => 3.14

// 可变参数:
(x, y, ...rest) => {
    var i, sum = x + y;
    for (i=0; i<rest.length; i++) {
        sum += rest[i];
    }
    return sum;
}

如果要返回一个对象,就要注意,如果是单表达式,这么写的话会报错:

// SyntaxError:
x => { foo: x }

因为和函数体的{ ... }有语法冲突,所以要改为:

// ok:
x => ({ foo: x })

this

箭头函数看上去是匿名函数的一种简写,但实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的this是词法作用域,由上下文确定。

回顾前面的例子,由于JavaScript函数对this绑定的错误处理,下面的例子无法得到预期结果:

var obj = {
    birth: 1990,
    getAge: function () {
        var b = this.birth; // 1990
        var fn = function () {
            return new Date().getFullYear() - this.birth; // this指向window或undefined
        };
        return fn();
    }
};

现在,箭头函数完全修复了this的指向,this总是指向词法作用域,也就是外层调用者obj:

var obj = {
    birth: 1990,
    getAge: function () {
        var b = this.birth; // 1990
        var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
        return fn();
    }
};
obj.getAge(); // 25

如果使用箭头函数,以前的那种hack写法:var that = this;这就不需要了。由于this在箭头函数中已经按照词法作用域绑定了,所以,用call()或者apply()调用箭头函数时,无法对this进行绑定,即传入的第一个参数被忽略:

var obj = {
    birth: 1990,
    getAge: function (year) {
        var b = this.birth; // 1990
        var fn = (y) => y - this.birth; // this.birth仍是1990
        return fn.call({birth:2000}, year);
    }
};
obj.getAge(2015); // 25

相关推荐

# Python 3 # Python 3字典Dictionary(1)

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如...

Python第八课:数据类型中的字典及其函数与方法

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值...

Python中字典详解(python 中字典)

字典是Python中使用键进行索引的重要数据结构。它们是无序的项序列(键值对),这意味着顺序不被保留。键是不可变的。与列表一样,字典的值可以保存异构数据,即整数、浮点、字符串、NaN、布尔值、列表、数...

Python3.9又更新了:dict内置新功能,正式版十月见面

机器之心报道参与:一鸣、JaminPython3.8的热乎劲还没过去,Python就又双叒叕要更新了。近日,3.9版本的第四个alpha版已经开源。从文档中,我们可以看到官方透露的对dic...

Python3 基本数据类型详解(python三种基本数据类型)

文章来源:加米谷大数据Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变...

一文掌握Python的字典(python字典用法大全)

字典是Python中最强大、最灵活的内置数据结构之一。它们允许存储键值对,从而实现高效的数据检索、操作和组织。本文深入探讨了字典,涵盖了它们的创建、操作和高级用法,以帮助中级Python开发...

超级完整|Python字典详解(python字典的方法或操作)

一、字典概述01字典的格式Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值key=>value对用冒号:分割,每个对之间用逗号,...

Python3.9版本新特性:字典合并操作的详细解读

处于测试阶段的Python3.9版本中有一个新特性:我们在使用Python字典时,将能够编写出更可读、更紧凑的代码啦!Python版本你现在使用哪种版本的Python?3.7分?3.5分?还是2.7...

python 自学,字典3(一些例子)(python字典有哪些基本操作)

例子11;如何批量复制字典里的内容2;如何批量修改字典的内容3;如何批量修改字典里某些指定的内容...

Python3.9中的字典合并和更新,几乎影响了所有Python程序员

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

Python3大字典:《Python3自学速查手册.pdf》限时下载中

最近有人会想了,2022了,想学Python晚不晚,学习python有前途吗?IT行业行业薪资高,发展前景好,是很多求职群里严重的香饽饽,而要进入这个高薪行业,也不是那么轻而易举的,拿信工专业的大学生...

python学习——字典(python字典基本操作)

字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包含的元素个数不限,值...

324页清华教授撰写【Python 3 菜鸟查询手册】火了,小白入门字典

如何入门学习python...

Python3.9中的字典合并和更新,了解一下

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

python3基础之字典(python中字典的基本操作)

字典和列表一样,也是python内置的一种数据结构。字典的结构如下图:列表用中括号[]把元素包起来,而字典是用大括号{}把元素包起来,只不过字典的每一个元素都包含键和值两部分。键和值是一一对应的...

取消回复欢迎 发表评论:

请填写验证码