首页 > 其他分享 >4.this的原理以及几种不同使用场景的取值

4.this的原理以及几种不同使用场景的取值

时间:2023-03-04 15:11:36浏览次数:43  
标签:function 场景 console log 指向 bind 几种 取值 函数

1.this原理

this是JavaScript的一个关键字,函数调用时才会出现;
因为函数是在一定的环境中运行的,调用函数时肯定需要知道是[谁调用的]?就用到了this进行指向;
那么this到底指向的是什么?
this 既不指向函数自身,也不指函数的词法作用域,而是调用函数时的对象

2.使用场景

1.普通函数的调用,this指向的是Window

2.对象的方法,this指的是该对象

3.多层作用域链时,this指的是距离方法最近的一层对象

4.构造函数的调用,this指的是实例化的新对象

5.apply和call调用时,this指向参数中的对象

6.匿名函数调用,指向的是全局对象

匿名函数的三种方法

//①先用()包起来,然后再后面跟 (参数) 
(function(data){
  console.log(data);
})("222");
 
//②先后面跟(参数),然后再()包起来
(function(data){
  console.log(data);
}("333"));
 
//③正常函数格式,前面加 !
!function(data){
  console.log(data);

7.定时器中调用,指向的是全局变量

其实定时器的本质,也是一种匿名函数的形式。

 

8.箭头函数的this

箭头函数作为匿名函数,式不能作为构造函数的,不能使用new

箭头函数不绑定arguments,取而代之用rest参数…解决   

function A(a){
  console.log(arguments); //[object Arguments] {0: 1}
}
var B = (b)=>{
  console.log(arguments); //ReferenceError: arguments is not defined
}
var C = (...c)=>{ //...c即为rest参数
  console.log(c); //[3]
}
A(1);
B(2);
C(3);

箭头函数会捕获其所在上下文的this值,作为自己的this值

var obj = {
  a: 10,
  b: function(){
    console.log(this.a); //10
  },
  c: function() {
     return ()=>{
           console.log(this.a); //10
     }
  }
}
obj.b(); 
obj.c()();

箭头函数没有原型属性

3.this指向的优先级 ?

new>显式绑定>隐式绑定>默认绑定

默认绑定:默认函数指向wiindow

隐式绑定:object 箭头函数

显式绑定:apply call bind

new:构造函数

4.如何改变this指向?

三种方法:

call() 它可以调用函数也可以改变函数this的指向,一般用于继承

apply() 它也可以调用函数,也可以修改this指向,但他传递的参数必须在数组中呈现

bind()它不会主动调用函数,但是可以修改this指向,它返还的是原函数this指向改变之后的新函数

function fun() {
  console.log(this);  // 原来的函数this指向的是 Window
}
fun();
function fun(a, b) {
  console.log(this); // this指向了输入的 字符串apply
  console.log(a + b);
}
//使用apply() 方法改变this指向,
//此时第一个参数是 字符串apply,那么就会指向字符串apply
fun.apply('apply', [2, 3])  // 原函数的参数要以数组的形式呈现

bind() 方法的用法和call()一样,直接运行方法,需要注意的是:bind返回新的方法,

需要重新调用,是需要自己手动调用的

function fun() {
    console.log(this);  // 原来的函数this指向的是 Window
}

fun();
function fun(a, b) {
    console.log(this); // this指向了输入的 字符串bind
    console.log(a + b);
}

//使用bind() 方法改变this指向,此时第一个参数是 字符串bind,那么就会指向字符串bind
let c = fun.bind('bind', 2, 3);

c(); // 返回新的方法,需要重新调用

 

标签:function,场景,console,log,指向,bind,几种,取值,函数
From: https://www.cnblogs.com/alwaysrun/p/17178179.html

相关文章

  • 性能测试-模拟oom场景
    1、模拟环境搭建1.1tomcat下载与搭建下载地址:https://tomcat.apache.org/download-90.cgi   1.2解压安装cd/data/jvmpretest#解压tar-zxvfapache-tomc......
  • 实现js继承的几种方式以及他们的优缺点
    7.实现继承的几种方式以及他们的优缺点①类式继承(构造函数) varfather=function(){  this.age=52;  this.say=function(){   alert('helloiam'......
  • C#获取串口的几种方式
    摘要使用C#获取串口最简单的方式就是通过SerialPort对象了,但有时并不能满足需求,比如有些串口是通过驱动模拟的,那这种可能就获取不到了。示例代码这里简单演示几种常用的......
  • JS文件的几种格式之间的区别
    今天在修改公司ui组件库的时候,接触到npmrunlib,发现打包后文件有几种格式的文件。.common.js.common.js.map.umd.js.umd.js.map.umd.min.js.umd.min.js.map几种不......
  • 从Linq的Where方法理解泛型、委托应用场景
      最近遇到了一个问题,Linq的Where里面传递的是什么?Where的功能是什么实现的?没有第一时间答上来,在整理相关资料后决定自行实现Linq的Where方法来加深印象。什么是泛型......
  • Java Agent场景性能测试分析优化经验分享
    摘要:本文将以Sermant的SpringBoot注册插件的性能测试及优化过程为例,分享在JavaAgent场景如何进行更好的性能测试优化及在JavaAgent下需要着重注意的性能陷阱。作者:栾文......
  • C# - ConcurrentDictionary 并发场景使用注意事项
    1自身作为Enumerable的遍历自身作为可遍历对象,键值对为元素进行遍历,是线程安全的,但不提供快照,遍历过程中集合产生变更会直接反馈至此次遍历过程中。但并不一定能够保障......
  • Android的延迟实现的几种解决方案以及原理分析
    写这篇文章的目的,是看到群里有人在实现延迟的时候,用如下的第四种方法,个人感觉有点不妥,为了防止更多的人有这种想法,所以自己抽空深入分析,就分析的结果,写下此文,希望对部分人......
  • 几种类型神经网络学习笔记
    跟随【导师不教?我来教!】同济计算机博士半小时就教会了我五大深度神经网络,CNN/RNN/GAN/transformer/LSTM一次学会,简直不要太强!_哔哩哔哩_bilibili了解的五大神经网络,整理笔......
  • Json数组形式的字符串转为Map数组 Map集合的几种遍历方式
    //Json数组形式的字符串转为Map数组StringstrArr="[{"name":"xx","age":"16"},{"name":"yy","age":"18"}]";//第一种方式List<Map<String,String>......