JavaScript ES6语法之箭头函数及其this指向问题

news/2024/7/19 15:54:53 标签: javascript, js, ecmascript

箭头函数

所谓的箭头函数是函数的另一种语法形式。

语法规则

const fun = function(){}     普通函数
const fun = ()=>{}           箭头函数
将匿名函数的部分,从 function(){} 写成 ()=>{} 的形式
实例
<div>我是div</div>
<script>javascript">
    const oDiv = document.querySelector('div');
    
    // 普通函数
    oDiv.addEventListener('click' , function(){
        console.log('我是div标签')
    });
    
    // 箭头函数
    oDiv.addEventListener('click' , ()=>{
        console.log('我是div标签');
    });
</script>
如果函数只有一个参数,可以不写()
const fun = function(e){}     普通函数
const fun = e => {}           箭头函数
实例
<div>我是div</div>
<script>javascript">
    const oDiv = document.querySelector('div');
    
    // 只有一个参数,可以不写(),直接定义一个参数
    oDiv.addEventListener('click' , e=>{
        console.log(e);
    });
</script>
如果执行体中只有一行代码,可以不写{}
const fun = e=>{console.log(e)}    普通箭头函数
const fun = e=> console.log(e)     不写{}箭头函数
实例
<div>我是div</div>
<script>javascript">
    // 只有一行代码,不写{}
    oDiv.addEventListener('click' , e=>console.log(e) )
</script>

箭头函数中的this指向

在箭头函数中,this指向有特殊的意义,专门可以用来配合构造函数和面向对象编程思想。

规则

在箭头函数中,this指向要看父级程序的this指向
如果父级程序有this指向,那么箭头函数指向的就是父级程序的this
如果父级程序没有this指向,那么指向的就是window

普通函数的this指向

声明式,赋值式/匿名函数,对象中函数,绑定的事件处理函数
this都是指向的调用函数时,之前定义的内容

实例
<div>1234</div>
<script>javascript">
    // 1,声明式 --- 指向的是window
    function fun1(){
        console.log(this);
    }
    fun1();
    
    // 2,匿名函数/赋值式 --- 指向的是window
    const fun2 = function(){
        console.log(this);
    };
    fun2();
    
    // 3,定义在对象中的函数 --- 指向的是对象
    const obj = { 
        fun3 : function(){
            console.log(this);
        }
    };
    obj.fun3();
    
    // 4,绑定的事件处理函数 --- 指向的是绑定事件处理函数的标签
    const oDiv = document.querySelector('div');
    oDiv.onclick = function(){
        console.log(this);
    };
    
    oDiv.addEventListener('click' , function(){
        console.log(this);
    });
</script>

箭头函数的tihs指向

与普通函数的this指向是有区别的
箭头函数中,this的指向是父级程序的this指向

实例
<div>1234</div>
<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
</ul>
<script>javascript">
    const oDiv = document.querySelector('div');
    // 当前的程序,,箭头函数的父级程序,没有
    // this指向的就是window
    oDiv.addEventListener('click' , ()=>{
        console.log(this);
    });
    
    // 对li进行操作
    const oLis = document.querySelectorAll('li');
    oLis.forEach(function(item,key){
        console.log(this);  // 输出的是forEach的函数的this指向
        // 箭头函数的this,是父级程序,forEach()的this,是window
        item.addEventListener('click' , ()=>{
            console.log(key,this);
        })
    });
    
    // forEach()中 函数的this指向,就是window
    const arr = [1,2,3,4,5,6];
    arr.forEach(function(){
        console.log(this);
    });
    
    const obj = {
        // 普通函数,this指向对象
        fun1 : function(){console.log(this)},
        // 箭头函数this指向是,父级程序
        // 父级程序是对象
        // 只有函数有this,obj对象没有this
        // 父级程序没有this,指向的是window
        fun2 : ()=>{console.log(this)},
    
        // fun3是一个普通函数,this指向的是obj对象
        fun3 : function(){
            // fun4,是一个箭头函数,this指向的是父级程序的this指向
            // 父级程序是fun3,fun3的this是对象,fun4箭头函数的this也是对象
            const fun4 = ()=>{console.log(this)};
            fun4();
        }
    };
    obj.fun1();
    obj.fun2();
    obj.fun3();
</script>

关于this的总结

1,普通的function函数
 		声明式 --- window
 		赋值式 --- window
 		forEach循环 --- window
 		定时器,延时器 --- window
 		对象中的函数 --- 对象本身
 		事件绑定事件处理函数 --- 绑定事件的标签

2,箭头函数的this指向
 		父级程序的this指向
 		如果父级程序有this指向(父级程序也是函数),this指向的就是父级程序的this指向
 		如果父级程序没有this指向(数组,对象....),this指向的是window
 		
注意:箭头函数,不能改变this指向,只有普通function函数,能改变this指向。

http://www.niftyadmin.cn/n/1110709.html

相关文章

ZooKeeper的日志和快照

原文链接&#xff1a;ZooKeeper系列(5)&#xff1a;ZooKeeper的日志和快照 - 骏马金龙 - 博客园https://www.cnblogs.com/f-ck-need-u/p/9236954.html ZooKeeper有两种日志、一种快照。日志分为事务日志和ZooKeeper运行时的系统日志。 1.事务日志和快照 ZooKeeper集群中的每个…

UNIX安全构架的九点经验(转)

UNIX安全构架的九点经验(转)[more]  下面是一些个人的经验的总结&#xff0c;相信对于是否受到入侵的UNIX或者UNIX-clonefreebsd,openbsd&#xff0c;netbsd,linux,etc)都是有用的&#xff1a; 首先大家可以通过下面的系统命令和配置文件来跟踪入侵者的来源路径&#xff1a; …

构造方法和构造代码块

package com.bjpowernode.t07; /* * 构造代码块 * */public class TestConstractorBlock { public static void main(String[] args) { User user new User(); user.m1(); } } class User{ int age 18; //属性声明在构造代码块的下面&#xff0c;并且在构造代码块中使用了该属…

UNIX网络操作系统平台搭建初探(转)

UNIX网络操作系统平台搭建初探(转)[more]  摘要&#xff1a;SCO UNIX&#xff08;OpenServer&#xff09;是目前UNIX市场最流行的操作系统。它的成熟性、稳定性足以满足各类企业业务的运作和各种需求。本文主要介绍了UNIX网络操作系统平台搭建的步骤以及安装与使用中注意的要…

JavaScript 面向对象之工厂模式与构造函数详解

面向对象 什么是面向对象&#xff1f; 所谓的面向对象&#xff0c;是一种编程思想&#xff0c;编程思路&#xff0c;代码的书写格式。 之前为了简化代码&#xff0c;我们是将程序封装为函数的形式来调用 函数会有一些小问题:&#xff1a; 函数内部定义的局部作用域变量&…

对mysql乐观锁、悲观锁、共享锁、排它锁、行锁、表锁概念的理解

记得在上大学那会开始&#xff0c;在大学的课堂上&#xff0c;常常会听到老师讲什么共享锁&#xff0c;排它锁各种锁的词汇&#xff0c;以前仅仅听过一次就没有管了&#xff0c;并没有进行深入的研究 最近&#xff0c;在各种群里&#xff0c;又看见了什么乐观锁、悲观锁什么鬼…

全文检索引擎Solr系列——整合MySQL、MongoDB

MySQL 拷贝mysql-connector-java-5.1.25-bin.jar到E:\solr-4.8.0\example\solr-webapp\webapp\WEB-INF\lib目录下面配置E:\solr-4.8.0\example\solr\collection1\conf\solrconfig.xml123456<requestHandler name"/dataimport"class"org.apache.solr.handler.…

redis常见知识整理

为什么说Redis是单线程的以及Redis为什么这么快&#xff01; 主从同步&#xff08;复制&#xff09; https://www.nowcoder.com/discuss/92610 I/O多路复用。只有单个线程(一个快递员)&#xff0c;通过跟踪每个I/O流的状态(每个快递的送达地点)&#xff0c;来管理多个I/O流。 1…