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

JS关于定义函数的区别(为啥推荐第二种方式)

在平时开发的过程中,我们注意到函数的定义方式远不止一种,那么不同函数定义之间它们又有什么区别呢?看到一篇博客写的很不错所以Mark下来同大家分享一下!

博主看到了阮一峰大神的一篇博客,12种不宜使用的javascript语法
看到第9条的时候获得了启发,如下图:
在这里插入图片描述
接下来讲一下作者的见解,代码如下:

    <script>
            y();

            function y() {
                alert(2);
            };

            x();
            var x = function() {
                alert(1);
            };
        </script>

上面的代码运行以后,会先执行y()方法,并弹出2;然后在执行x()方法,但这里会报错:x is not a function

为什么会是这样的呢? 这就是函数定义2种方法的不同造成的。

上述y(),也就是定义函数的第一种方法 (官方称为-声明式定义函数)
大家知道JS变量是有变量声明提前的,其实函数也是有函数名声明提前的。
(另外,函数内部用var声明的局部变量也会把声明提前到函数代码顶部)
浏览器是从上到下开始解析,但因函数名声明提前(当没有解析到该方法代码之前,会自动提升到代码顶部,固能全局调用该方法)
尽管这个时候还没有解析到y()方法的代码,依然可以先调用该方法。所以y()方法会顺利执行,也不会报错。

上述x(),也就是定义函数的第二种方法(官方称为-函数表达式):
而x()方法则会报错提示:x is not a function, 因为第二种函数定义的写法,不会让函数名声明提前。
所以,浏览器从上往下执行,要先执行x()方法的代码,然后才能调用,比如下面这样就不会报错:

    var x = function() {
                alert(1);
            };
    x();

推荐第二种方式定义函数
注:函数表达式需要在语句的结尾加上分号,表示语句结束。而声明式定义函数在结尾的大括号后面不用加分号

补充:还有一种函数写法,官方称为(立即执行函数);
有 3 种 写法(推荐第一或第二种):

     (function(){
            alert(1);
        })();
        
        (function(){
            alert(2);
        }());
        
        !function(){
            alert(3);
        }();

作者原文链接:https://www.cnblogs.com/tu-0718/p/9584184.html

相关文章:

  • 关于对JS立即执行函数(function(){...})()的深度理解
  • 10分钟Canvas从入门到实践
  • e.target与e.currentTarget的区别
  • 解决:微信小程序饼状图组件层级过高覆盖在日历选择器上
  • JS中数组splice方法使用需要注意的点
  • JS中for,for...in,for...of和forEach的用法和区别
  • JSON.parse和JSON.stringify的用法
  • 一文搞懂JS中变量作用域的那些事
  • JS给函数添加属性
  • 开发中常见的一些Bug
  • 一分钟搞懂JS函数提升与变量提升的优先级
  • ES5中原型、实例对象和构造函数的那些事
  • 我的创作纪念日
  • JS之手写bind原理
  • 关于解决电脑蓝屏C:\Windows\System32\Logfiles\Str\StrTrail.txt
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • [译]Python中的类属性与实例属性的区别
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • AHK 中 = 和 == 等比较运算符的用法
  • bearychat的java client
  • Computed property XXX was assigned to but it has no setter
  • extjs4学习之配置
  • GitUp, 你不可错过的秀外慧中的git工具
  • golang 发送GET和POST示例
  • HTTP中的ETag在移动客户端的应用
  • JavaScript学习总结——原型
  • JavaScript中的对象个人分享
  • Linux链接文件
  • Python 基础起步 (十) 什么叫函数?
  • Python语法速览与机器学习开发环境搭建
  • Redux 中间件分析
  • spring boot下thymeleaf全局静态变量配置
  • vue-router的history模式发布配置
  • 闭包--闭包作用之保存(一)
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 思维导图—你不知道的JavaScript中卷
  • 微信小程序开发问题汇总
  • 树莓派用上kodexplorer也能玩成私有网盘
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #、%和$符号在OGNL表达式中经常出现
  • #pragma data_seg 共享数据区(转)
  • #WEB前端(HTML属性)
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (二)c52学习之旅-简单了解单片机
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)visual stdio 书签功能介绍
  • (转)人的集合论——移山之道