当前位置: 首页 > news >正文

【JavaScript 进阶教程】函数的定义 调用 及 this指向问题

这篇文章开始我们函数的进阶篇,和我们JavaScript基础学的函数有了很多拓展,这篇文章首先我们从函数的定义,调用,及其 this指向 来一个总结。 

文章目录:

一:函数的定义 

1.1 命名函数 

1.2 匿名函数 

1.3 利用 new Function() 声明函数

1.4 重要结论

 二:函数的调用

2.1 普通函数调用

2.2 立即执行函数调用

2.3 对象内方法调用

2.4 构造函数调用

2.5 事件函数的调用

2.6 定时器函数的调用

 三:各个函数的内部this指向问题


一:函数的定义 

函数的定义共三种方式:1.命名函数,2.匿名函数,3.利用 new Function() 来创建。

1.1 命名函数 

命名函数就是我们最常见的声明函数的方式,也叫做自定义函数

    <script>
        function fn(){
            console.log('我是命名函数');
        }
        fn()
    </script>

 


1.2 匿名函数 

匿名函数即没有名字的函数,匿名函数的调用需要使用立即执行函数,绑定事件时使用的也是匿名函数

    <script>
    //立即执行函数来调用匿名函数
       (function(a,b){     
           console.log(a+b);
       })(1,2)

    //绑定事件来使用匿名函数
       var div1=document.querySelector('div')
       div1.addEventListener('click',function(){
         console.log('我是绑定事件使用的匿名函数');
       })
    </script>


1.3 利用 new Function() 声明函数

还有一种不常见的函数声明方法是 new Function(),这个办法我们知道是个构造函数。但是由于这种方式比较繁琐麻烦,并且如果执行函数还需要转化语言格式为可识别的脚本语言,因此不使用这种方式声明函数,只需要知道 所有的函数都是Function构造函数的实例化对象(后面结论会说)


参数格式为:

  • new Function(‘参数一’,‘参数二’,‘参数三’,...... ,‘函数体)

(注意参数全部为字符串形式)

    <script>
         var fn=new Function('a','b','console.log(a+b)')
         fn(2,3)
    </script>


1.4 重要结论

通过刚才的第三种函数的声明方法,是个构造函数,我们会想到什么,为什么函数也有构造函数,难道函数也是对象吗?是的那我们接下来验证一下

    <script>
         var fn=new Function('a','b','console.log(a+b)')
         fn(1,3)
         console.dir(fn instanceof Object)
    </script>

 

结论:

      对此我们知道了函数也是对象就可以得到以下关系

  • 函数属于对象
  • 所有的函数都是Function构造函数的实例化对象

 二:函数的调用

函数的调用分为以下六种情况:

  • 普通函数调用
  • 立即执行函数调用
  • 对象内方法调用
  • 构造函数调用
  • 事件函数调用
  • 定时器函数调用

2.1 普通函数调用

普通函数调用可以直接写函数名调用,也可以使用 call() 方法调用

    <script>
        function fn(){
            console.log('我是一个普通函数的调用');
        }
        fn()
        fn.call()
    </script>


2.2 立即执行函数调用

立即执行函数通常用于匿名函数的调用,立即执行函数是自动调用的

    <script>
        (function(){
            console.log('立即执行函数调用了');
        })()
    </script>


2.3 对象内方法调用

对象内方法调用只需要  :实例化对象名称.方法名称

    <script>
        var obj={
            fn:function(){
                console.log('对象内的方法调用了');
            }
        }
        obj.fn()
    </script>


2.4 构造函数调用

构造函数的调用只需要 new实例化对象就可调用

    <script>
        function Animal(){}
        new Animal()
    </script>

2.5 事件函数的调用

事件对象调用需要触发事件就可以调用

    <script>
       var div1=document.querySelector('div')
       div1.addEventListener('click',function(){
         console.log('事件对象调用了');
       })
    </script>

2.6 定时器函数的调用

定时器内的函数为时间到后自动调用

    <script>
      window.setInterval(function(){
        console.log('定时器函数触发了');
      },1000)
    </script>


 三:各类函数的内部this指向问题

函数内部的 this 指向谁,是由我们调用时才知道的,一般情况是指向函数的调用者,下面是上一板块出现的几类函数的this指向

函数类型this 的指向

普通函数调用

window

立即执行函数调用

window

对象内方法调用

该方法的所属对象

构造函数调用

通过构造函数创建的实例化对象

事件函数调用

绑定事件的对象

定时器函数调用

window

 以上就是函数进阶第一板块的内容,创作不易,支持下吧!!

相关文章:

  • 14天刷爆LeetCode算法学习计划——Day02双指针(1)
  • 存储过程浅入深出
  • 一零二四、pyspark在jupyter中的完美运行
  • Nginx监控模块
  • mybatis的test坑(不等于‘‘ 且 不等于0)
  • 使用IDEA快速部署到Docker云端
  • 全志T507 UART复用方法-飞凌嵌入式知识库
  • 【机器学习】过拟合和欠拟合怎么判断,如何解决?(面试回答)
  • 2022年数模国赛冲刺之模型复习2
  • 程序包lombok不存在,纠正网上错误答案
  • css知识点总结
  • 【Rust日报】2022-08-29 RLS 谢幕
  • 【Python黑科技】图片太大不能上传?三种压缩图片大小的方法(代码注释详细)
  • hadoop生态圈面试精华之Yarn
  • 阿里云:加大NoSQL数据库软硬件一体化技术自研
  • 【笔记】你不知道的JS读书笔记——Promise
  • co模块的前端实现
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • iOS | NSProxy
  • IP路由与转发
  • JavaScript异步流程控制的前世今生
  • java正则表式的使用
  • jQuery(一)
  • laravel with 查询列表限制条数
  • Spring Boot MyBatis配置多种数据库
  • windows下如何用phpstorm同步测试服务器
  • 基于HAProxy的高性能缓存服务器nuster
  • 简析gRPC client 连接管理
  • 删除表内多余的重复数据
  • 微信小程序:实现悬浮返回和分享按钮
  • 优化 Vue 项目编译文件大小
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • #Linux(Source Insight安装及工程建立)
  • #QT(智能家居界面-界面切换)
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (bean配置类的注解开发)学习Spring的第十三天
  • (C++)八皇后问题
  • (vue)页面文件上传获取:action地址
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (一)80c52学习之旅-起始篇
  • (转)c++ std::pair 与 std::make
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET Micro Framework初体验(二)
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .NET框架
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .NET中GET与SET的用法
  • .Net中wcf服务生成及调用
  • .NET中的十进制浮点类型,徐汇区网站设计
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?