【渗透】关于Javascript的函数声明和函数表达式

news/2025/3/22 1:20:42

Javascript定义函数有两种类型

函数声明

// 函数声明
function wscat(type){return type==="wscat";
}

函数表达式

// 函数表达式
var oaoafly = function(type){return type==="oaoafly";
}

先看下面这个经典问题,在一个程序里面同时用函数声明和函数表达式定义一个名为getName的函数

    getName()//oaoaflyvar getName = function() {console.log('wscat')}getName()//wscatfunction getName() {console.log('oaoafly')}getName()//wscat

上面的代码看起来很类似,感觉也没什么太大差别。但实际上,Javascript函数上的一个“陷阱”就体现在Javascript两种类型的函数定义上。

JavaScript 解释器中存在一种变量声明被提升的机制,也就是说函数声明会被提升到作用域的最前面,即使写代码的时候是写在最后面,也还是会被提升至最前面。
而用函数表达式创建的函数是在运行时进行赋值,且要等到表达式赋值完成后才能调用
    var getName//变量被提升,此时为undefinedgetName()//oaoafly 函数被提升 这里受函数声明的影响,虽然函数声明在最后可以被提升到最前面了var getName = function() {console.log('wscat')}//函数表达式此时才开始覆盖函数声明的定义getName()//wscatfunction getName() {console.log('oaoafly')}getName()//wscat 这里就执行了函数表达式的值

所以可以分解为这两个简单的问题来看清楚区别的本质

    var getName;console.log(getName)//undefinedgetName()//Uncaught TypeError: getName is not a functionvar getName = function() {console.log('wscat')}var getName;console.log(getName)//function getName() {console.log('oaoafly')}getName()//oaoaflyfunction getName() {console.log('oaoafly')}
这个区别看似微不足道,但在某些情况下确实是一个难以察觉并且“致命“的陷阱。出现这个陷阱的本质原因体现在这两种类型在函数提升和运行时机(解析时/运行时)上的差异。
当然我们最后要给一个总结:Javascript中函数声明和函数表达式是存在区别的,函数声明在JS解析时进行函数提升,因此在同一个作用域内,不管函数声明在哪里定义,该函数都可以进行调用。而函数表达式的值是在JS运行时确定,并且在表达式赋值完成后,该函数才能调用。这个微小的区别,可能会导致JS代码出现意想不到的bug,让你陷入莫名的陷阱中。

https://dhexx.cn/news/show-1783105.html

相关文章

离群点检测方法_「Python数据分析基础」: 异常值检测和处理

本篇给大家分享数据清洗中的一个常见问题:异常值检测和处理。1什么是异常值?在机器学习中,异常检测和处理是一个比较小的分支,或者说,是机器学习的一个副产物,因为在一般的预测问题中,模型通常是…

Java 读取 jar 包文件

2019独角兽企业重金招聘Python工程师标准>>> 最近,做项目遇到这样一个需求,需要在 spring 容器启动后,从文件初始化一些数据。编码完成后,我在本地测试的时候,没有问题,文件可以读到。但是项目部…

空间滤波_第三章 灰度变换与空间滤波-(六)锐化空间滤波器之梯度

步子不要迈得太大,因为容易扯到蛋。没理解雷神的思维,为什么把一阶求导放在最后讲,为什么要在两个求导方法中间插入一个另类的非锐化掩蔽。使用一阶微分对(非线性)图像锐化----梯度老规矩,要看标题就知道我…

响应式Spring Cloud初探

响应式Spring Cloud初探 分类:工程原文链接:The Road to Reactive Spring Cloud作者: JOSH LONG译者: helloworldtang日期:JUNE 20, 2018 Spring Cloud Finchley GA release 充满了好用的新特性,它是响应式…

vs用eigen3计算矩阵乘法_深度学习矩阵乘法的终极奥义einsum,结合多个计算框架上的使用...

说明:讲解时会对相关文章资料进行思想、结构、优缺点,内容进行提炼和记录,相关引用会标明出处,引用之处如有侵权,烦请告知删除。转载请注明:DengBoCong这里我们来好好探讨一下深度学习中,矩阵乘…

模拟知乎登录——Python3

经常写爬虫的都知道,有些页面在登录之前是被禁止抓取的,比如知乎的话题页面就要求用户登录才能访问,而 “登录” 离不开 HTTP 中的 Cookie 技术。 登录原理 Cookie 的原理非常简单,因为 HTTP 是一种无状态的协议,因此为…

使用pm2启动node文件_使用pm2自动化部署node项目的方法步骤

1、pm2简介pm2(process manager)是一个进程管理工具,维护一个进程列表,可以用它来管理你的node进程,负责所有正在运行的进程,并查看node进程的状态,也支持性能监控,负载均衡等功能。1.1、使用pm2管理的node…

Spring Cloud Eureka 服务注册列表显示 IP 配置问题

服务提供者向 Eureka 注册中心注册,默认以 hostname 的形式显示,Eureka 服务页面显示的服务是机器名:端口,并不是IP端口的形式 ,可以通过修改服务提供者配置自己的 IP 地址,并显示在 Eureka 的注册列表中。 默认eureka.instance.instance-id …

mysql免安装_mysql——免安装配置

1、下载(1)下载地址:https://dev.mysql.com/downloads/mysql/(2)选择下载2、配置环境变量(1)解压目录:D:\mysql-8.0.16-winx64(2)配置环境变量3、添加配置文件(1)配置文件目录:D:\mysql-8.0.16-winx64(2)配置文件名:my.ini(3)文件…

【Linux】如何正确安装Tomcat

在Linux系统上安装Tomcat,相信对大家来讲已经是很普通的很简单的任务了。虽然我也配置过很多次,还是重新整理一下作为备忘吧。 【环境】 UbuntuSun Jdk1.8tomcat8.0.52 1.下载tomcat安装包,当然是从官网下载 wget http://mirror.bit.edu.cn/apache/tomca…