IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> JavaScript 箭头函数与普通函数 -> 正文阅读

[JavaScript知识库]JavaScript 箭头函数与普通函数

箭头函数没有自己的 this,与外层函数保持一致

所有函数在执行时,会创建一个函数执行上下文,普通函数的执行上下文中会有一个变量 this,而箭头函数没有。

箭头函数中如果出现了 this ,它会永远去拿定义时、作用域链上、最近的那个 this,比如下面 demo 中,取的就是全局执行环境中的 this,指向全局对象。

<script>
var id = 'wgchen'

// 箭头函数定义在全局作用域
let fun1 = () => {
  console.log(this.id)
}

fun1(); // 'wgchen'

// this的指向不会改变,永远指向Window对象
fun1.call({ id: 'Obj' }) // 'wgchen'
</script>

思考题:下面的代码会输出什么?

<script>
var id = 'wgchen'

function fun1() {
  // setTimeout中使用普通函数
  setTimeout(function fun3() {
    console.log(this.id)
  }, 2000);
}

function fun2() {
  // setTimeout中使用箭头函数
  setTimeout(() => {
    console.log(this.id)
  }, 2000);
}

fun1(); // 'wgchen'
fun2(); // 'wgchen'

fun1.call({ id: 'Obj' }) // 'wgchen'
fun2.call({ id: 'Obj' }) // 'Obj'
</script>

1、fun3 本身有 this,因为 setTimout 使得 fun3 是在全局上下文中执行,这个 this 指向全局执行环境;

2、同理,setTimout 使得箭头函数是在全局上下文中执行,但是箭头函数本身没有 this,它会沿着作用域链查找,找到 fun2 中创建的 this,也指向全局执行环境;

3、fun1.call 调用过程中,修改了 fun1 的 this 指向,但 fun3 本身也创建有 this,setTimeout 使得这个 this 指向全局执行环境;

4、fun1.call 调用过程中,修改了 fun1 的 this 指向,箭头函数没有 this,按照作用域链找到 fun1 的 this,于是最后指向 {id: ‘Obj’}。

箭头函数不能作为构造函数

因为箭头函数没有自己的 this 变量,我们就没有办法修改 this 的指向,所以也不可以将其作为构造函数、它也没有 prototype 对象。

let Fun = (name, age) => {
  this.name = name
  this.age = age
}

// 报错
let p = new Fun('mybj', 4)

箭头函数没有 arguments 对象

大概很多人都没用 arguments 对象,它是在所有普通函数中都可用的一个局部变量。

代表函数调用时传递的参数,arguments 对象不是一个数组,是一个类数组。

它除了 length 属性和索引之外,没有任何数组属性,比如 slice 等方法。

所以通常会使用使用 Array.prototype.slice.call(arguments)/[...arguments] 的方式,将它转换成一个数组。

<script>
let showArguments = function () {
  // Arguments(2) ['params1', 'params2', callee: ?, Symbol(Symbol.iterator): ?]
  console.log(arguments)
  
  //  ['params1', 'params2']
  console.log(Array.prototype.slice.call(arguments)) 
}

showArguments('params1', 'params2')

</script>

在这里插入图片描述

箭头函数和普通函数共有的 length 属性

这部分不属于区别,但写到这里想补充一下。这也是一个不太常见的属性,做过一些手撕题的应该都使用过。

函数的 length 属性,是指形参的个数
准确说是:
第一个具有默认值之前的参数个数,并且不包括剩余参数个数。

与之相对应的是,arguments.length 指的是实际参数的个数。

<script>
const showLength = function(a, b, c, d){
  console.log(`实际参数的个数:${arguments.length}`)
}

console.log(`形参的个数:${showLength.length}`) //形参的个数:4

//形参的个数:3
console.log(`形参的个数:${showLength.bind(this, '3').length}`)

showLength('1','2');// 实际参数的个数:2
showLength.call(this, '3') // 实际参数的个数:1

</script>

在这里插入图片描述

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:02:05  更:2022-04-04 12:05:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:33:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码