箭头函数与this指向问题

本文详细解析了箭头函数的this指向行为,介绍了var、let与const的差异,以及global与module的使用场景。重点讨论了普通函数与箭头函数在this、作用域和参数传递上的区别,适合理解JavaScript高级特性。
摘要由CSDN通过智能技术生成

箭头函数:

let sayName=()=>{
    // 函数体
}

箭头函数内部this指向

let name = 'zhangsan';// let声明的全局变量不属于全局对象,存在于一个块级作用域中也就是当前文件模块中
let sayName=()=>{
    console.log(this.name);//这里的this指向外层的this,因此指向全局对象
}
sayName();//undefined 全局对象中不存在name属性
console.log(this);//{} 全局中的this指向的是module.exports

运行结果为undefined。因为箭头函数实际上是没有this的,函数内部的this指向外部声明箭头函数时的this。

全局变量var、let&const区别

var

1.全局的 var 变量其实仅仅是为 global 对象添加了一条属性。

var name='zhangsan';
// 等同于 windows.name='zhangsan';
console.log(windows.name);//zhangsan

 2.var声明的变量会提升,可以重复声明,具有函数作用域
只能在对应代码块中使用

    4.const声明的变量在声明的时候就需要赋值,并且只能赋值一次,不能修改。

let / const

1.用 let 和 const 声明的全局变量并没有在全局对象中,只是一个块级作用域(Script)中

箭头函数中的this问题,如下案例:

//1.
let name = 'zhangsan';
let sayName=()=>{
    console.log(this.name);
}
console.log(this.name);// undefined this存在于全局中,指向module.exports
module.exports.name = 'lisi'; // 给module.exports添加属性
console.log(this.name);// 此时输出结果为:lisi 
sayName();// 箭头函数的this指向全局this, 因此打印结果为lisi
//2.
let name = 'zhangsan';
module.exports.name = 'lisi';
let sayName=()=>{
    console.log(this.name);
}
let obj = {
    name,
    sayName(){
        console.log(this.name);//zhangsan
        return sayName();//lisi 这里的sayName不是声明在方法中的,只是在这里被调用,因此这里的this指向外部声明函数时的this
    }
}

 2.let/const不会变量提升,不可以重复声明,具有局部作用域。const:声明时候必须赋值

2.1.let 用于声明一个变量

    1 变量不会提升,即在变量声明之前无法使用该变量

    2.不可以重复声明

    3.具有块级作用域,只在当前作用域有效

2.2.const 用于声明一个常量

    1.变量声明不会被提升,即在变量声明之前无法使用该变量

    2.不允许重复声明。

    3.具有局部作用域,即const声明的变量

global与module区别

global

global是全局属性,凌驾于所有单独的模块之上,global的属性各个模块都可以访问到,不需要使用module.exports暴露出去

module

一个文件就是一个模块,单个模块的顶级对象就是module,module包含了当前模块的所有信息,

而module.exports指的是当前文档所暴露的内容。模块内部的变量只能在当前模块使用,模块内的属

性想要被其他模块访问,需要使用module.exports暴露。

普通函数和箭头函数的区别

1.表现形式不同

// 普通函数
function fun(){
  // 函数体
}
// 箭头函数
let fun=()=>{
  // 函数体
}

2.普通函数的arguments保存实际参数

3.箭头函数rest参数保存实际参数

 // rest参数 返回一个保存实参得数组 拓展运算符
let test=(a,...b)=>{
    // ...拓展运算符
    console.log(a,b);// 1 [ 2, 3 ]
    // es6 箭头函数 arguments不再保存实参列表
    console.log(arguments,2);//[Arguments] {......} 2
}
test(1,2,3)

4.this指向问题

普通函数:this总是指向调用它的对象,如果用作构造函数,this指向创建的对象实例。可以通过call()、apply()和bind()方法改变this指向

箭头函数:箭头函数本身没有this,内部this指向声明箭头函数时外部作用域this,无法改变箭头函数的指向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值