JS 函数提升&变量提升以及函数声明&函数表达式的区别
感谢原文作者:迟早会有猫
原文链接:https://www.cnblogs.com/SidselLoong/p/10515809.html
今天看js的变量提升问题,里面提到了函数提升。然后发现自己之前一直把函数声明和函数表达式弄错,导致函数提升出错
一、变量提升
console.log(a)
var a=100 //undefined
console.log(a)//100
提升后相当于
var a; //变量提升,全局作用域范围内,此时只是声明,并没有赋值
console.log(a); //undefined
a=100 //此时赋值
console.log(a) //100
二、函数提升
注意:js中创建函数有两种方式:函数声明和函数表达式。只有函数才能函数提升!!!
(因为之前一直没有分清函数声明和函数表达式,所以在函数提升上经常出错 ==)
先简单认识下函数声明和函数表达式
//函数声明
function fn1(){
console.log(12)
}
//函数表达式
var fn2 = function () {
console.log(222)
}
f1() //123
f2() //error:f2 is not a function
// 函数声明
function f1() {
console.log(123)
}
// 函数表达式
var f2 = function() {
console.log(222)
}
提升后
// 函数声明-----提升
function f1() {
console.log(123)
}
var f2;
f1() //123
f2() //error:f2 is not a function
// 函数表达式
f2 = function() {
console.log(222)
}
2.1函数提升
fn('zhangsan') //zhangsan 20
function fn(name) {
age = 20
console.log(name,age)
var age
}
提升后相当于
function fn(name) {
var age; //变量提升,定义age
age=20; //变量赋值
console.log(name,age)
}
fn('zhangsan')
2.2函数表达式
fn1('lisi')//fn1 is not a function
var fn1=function (name){
age = 20
console.log(name,age)
var age
}
提升效果
var fn1;
fn1('lisi')//fn1 is not a function
fn1=function (name){
var age;
age = 20
console.log(name,age)
}
我的理解
变量提升:将变量声明提至当前scope的最顶部,赋值语句留在原地!所以在赋值语句前调用会出现undefined
。
函数提升:分为两种,一种是纯函数提升,一种是函数表达式提升,函数表达式实质上就是变量提升,另外函数提升的优先级比变量提升高!
另外查阅
https://www.runoob.com/js/js-hoisting.htmlhttps://www.cnblogs.com/liuhe688/p/5891273.html
https://www.cnblogs.com/damonlan/archive/2012/07/01/2553425.html
https://zhuanlan.zhihu.com/p/43607950
JS 函数提升&变量提升以及函数声明&函数表达式的区别的更多相关文章
- 【JS】函数提升变量提升以及函数声明和函数表达式的区别
今天看js的变量提升问题,里面提到了函数提升.然后发现自己之前一直把函数声明和函数表达式弄错,导致函数提升出错 一.变量提升 console.log(a) var a=100 //undefined ...
- js中的变量提升与函数提升
先看看一个简单的代码 var str='Hello World'; alert(str);//弹出 Hello World 再看一段代码: var v='Hello World'; (function ...
- js中的变量提升和函数提升
从上周开始,我所在的学习小组正式开始了angular的学习,angular是全面支持es6的,所以语法上和以前的angular有了很大的不同,比如变量声明时就抛弃了var,而选择了let和const: ...
- js函数、变量提升(hoisting)
其实我只是想复习下变量提升的,然后看到了函数提升,然后再看到了函数声明.函数表达式. 有必要怀着敬仰之心提及园子里的TOM大叔的解密命名函数表达式,不愧是大叔,好好地脑补了下基础知识. 在ECMASc ...
- JS 会有变量提升和函数提升
JavaScript变量函数声明提升(Hoisting)是在 Javascript 中执行上下文工作方式的一种认识(也可以说是一种预编译),从字面意义上看,"变量提升"意味着变量和 ...
- JS高级_变量提升和函数提升
先执行变量提升,后执行函数提升 function a(){} var a console.log(typeof a)//function
- JS基础_变量提升和函数提升
1.在函数中,不使用var声明的变量都会变为全局变量 function fun(){ d=10; //window.d=10; }; console.log(10);//10 2.定义形参就相当于在函 ...
- JavaScript中函数的变量提升问题
函数的大体分三种,一种是函数的声明,一种是函数表达式(又称为函数的字面量) 1.函数的声明 => function myFn(){}; 2.函数的表达式 => var myFn = fun ...
- JS中的 变量提升
首先纠正下,文章标题里的 “变量提升” 名词是随大流叫法,“变量提升” 改为 “标识符提升” 更准确.因为变量一般指使用 var 声明的标识符,JS 里使用 function 声明的标识符也存在提升( ...
随机推荐
- 【Java例题】5.4 排序集合的使用
4.排序集合的使用.使用TreeSet模拟一个一维整数数组.其中,一维整数数组元素由Random类随机产生.最后显示排序后的结果. package chapter6; import java.util ...
- Spring Boot实战三:集成RabbitMQ,实现消息确认
Spring Boot集成RabbitMQ相比于Spring集成RabbitMQ简单很多,有兴趣了解Spring集成RabbitMQ的同学可以看我之前的<RabbitMQ学习笔记>系列的博 ...
- 网站迁移纪实:从Web Form 到 Asp.Net Core (Abp vNext 自定义开发)
问题和需求 从2004年上线,ZLDNN.COM运行已经超过16年了,一直使用DotNetNuke平台(现在叫DNN Platform),从最初的DotNetNuke 2.1到现在使用的7.4.先是在 ...
- Java得到当前时间并格式化输出
代码: SimpleDateFormat sdf = new SimpleDateFormat();// 格式化时间 sdf.applyPattern("yyyy-MM-dd HH:mm:s ...
- MySQL数据操作与查询笔记 • 【第3章 DDL 和 DML】
全部章节 >>>> 本章目录 3.1 使用 DDL 定义数据库表结构 3.1.1 SQL 简介 3.1.2 维护数据库和创建数据表 3.2 使用 DDL 维护数据库表结构 ...
- GDB调试-从入门到实践
你好,我是雨乐! 在上篇文章中,我们分析了线上coredump产生的原因,其中用到了coredump分析工具gdb,这几天一直有读者在问,能不能写一篇关于gdb调试方面的文章,今天借助此文,分享一些工 ...
- 初识python: xlsxwriter 将数据写入Excel
使用 xlsxwriter 模块将数据写入excel . #!/user/bin env python # author:Simple-Sir # time:2020/9/24 12:51 # 使用 ...
- selenium实现并发
for循环和多线程 + selenium 实例一 for循环 # -*- coding: utf-8 -*- """ Datetime: 2019/6/22 Author ...
- netty系列之:一口多用,使用同一端口运行不同协议
目录 简介 SocksPortUnificationServerHandler 自定义PortUnificationServerHandler 总结 简介 在之前的文章中,我们介绍了在同一个netty ...
- Solon 开发,二、注入或手动获取Bean
Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...