JS_函数中this的指向多情况分析
1.默认绑定
默认绑定this都是指向的window全局对象
JS中只要定义了一个方法,那么该方法就会有this指向,然而在不同的情况this的指向也会有所不同
情况一:函数直接调用
情况二:通过对象调用
情况三:箭头函数调用
1 | // 1.直接调用 |
上面两种方式的调用this都是默认绑定,指向的window全局对象
补充:若是在严格模式”use strict”下,独立调用的函数的this指向是指向undefined
2.隐式绑定
隐式绑定this指向的是某个对象发起的函数调用,指向这个对象本身
1 | // 也就是它的调用位置中,是通过某个对象发起的函数调用 |
this指向的是x这个对象本身。
3.new关键字
使用new关键词时,会创建一个新的空对象,this指向这个空对象【简单解释】
1 |
|
控制台打印结果为:foo {}
4.显示绑定apply、call、bind
4.1 call函数
可以执行call函数,强制this指向某一个对象,可以明确的告诉this绑定什么,直接了当
1 | var obj = { |
4.2 apply函数
apply函数主要与call的区别是传入的参数格式不同,都可以明白告诉this绑定什么
1 | /* |
4.3 bind函数
bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时进行使用
官方:Function.prototype.bind()
Function
实例的 bind() 方法创建一个新函数,当调用该新函数时,它会调用原始函数并将其 this
关键字设置为给定的值,同时,还可以传入一系列指定的参数,这些参数会插入到调用新函数时传入的参数的前面。
1 |
|
经典案例:
1 | const module = { |
4.4 call()、apply()、bind()的区别及用法
简单用法:都是用来改变this的指向
call、apply的一个区别:
相同点:都是调用一个对象的一个方法,用另一个对象替换当前对象(功能相同)
不同点:参数格式不同
call()的第一个参数是this要指向的对象,后面传入的是参数列表,参数可以是任意类型,当第一个参数为null、undefined的时候,默认指向window;
apply():第一个参数是this要指向的对象,第二个参数是数组[]
call、bind的一个区别:
相同点: 都是用来改变this的指向
不同点:call改变this的指向后会再执行函数,bind改变this的指向后不会再执行函数,返回一个绑定新this的函数【React有用到】
用法:call函数
- 用来判断数据类型! 延伸–判断数据类型的方式有哪几种?
在判断数据类形式使用typeof,一般不是太准确的,我们可以使用Object.prototype.toString.call()方法来判断一个数据的数据类型
用法:apply函数
- 进行求和计算
4.5 扩展:函数绑定的新姿势 ——ES7 bind 运算符(::)
ES7 bind 运算符是一种新的绑定语法,它使用两个冒号 (::) 表示,通常被称为 “双冒号运算符” 或者 “作用域解析运算符”。它的作用是将一个函数绑定到一个特定的上下文中。bind 运算符始终将左边的表达式作为函数的上下文(即 this),右边的表达式作为函数名,同时还会将左边表达式中的属性和方法转移到右边表达式中。