感谢原文作者:迟早会有猫

原文链接: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.html

https://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 函数提升&变量提升以及函数声明&函数表达式的区别的更多相关文章

  1. 【JS】函数提升变量提升以及函数声明和函数表达式的区别

    今天看js的变量提升问题,里面提到了函数提升.然后发现自己之前一直把函数声明和函数表达式弄错,导致函数提升出错 一.变量提升 console.log(a) var a=100 //undefined ...

  2. js中的变量提升与函数提升

    先看看一个简单的代码 var str='Hello World'; alert(str);//弹出 Hello World 再看一段代码: var v='Hello World'; (function ...

  3. js中的变量提升和函数提升

    从上周开始,我所在的学习小组正式开始了angular的学习,angular是全面支持es6的,所以语法上和以前的angular有了很大的不同,比如变量声明时就抛弃了var,而选择了let和const: ...

  4. js函数、变量提升(hoisting)

    其实我只是想复习下变量提升的,然后看到了函数提升,然后再看到了函数声明.函数表达式. 有必要怀着敬仰之心提及园子里的TOM大叔的解密命名函数表达式,不愧是大叔,好好地脑补了下基础知识. 在ECMASc ...

  5. JS 会有变量提升和函数提升

    JavaScript变量函数声明提升(Hoisting)是在 Javascript 中执行上下文工作方式的一种认识(也可以说是一种预编译),从字面意义上看,"变量提升"意味着变量和 ...

  6. JS高级_变量提升和函数提升

    先执行变量提升,后执行函数提升 function a(){} var a console.log(typeof a)//function

  7. JS基础_变量提升和函数提升

    1.在函数中,不使用var声明的变量都会变为全局变量 function fun(){ d=10; //window.d=10; }; console.log(10);//10 2.定义形参就相当于在函 ...

  8. JavaScript中函数的变量提升问题

    函数的大体分三种,一种是函数的声明,一种是函数表达式(又称为函数的字面量) 1.函数的声明 => function myFn(){}; 2.函数的表达式 => var myFn = fun ...

  9. JS中的 变量提升

    首先纠正下,文章标题里的 “变量提升” 名词是随大流叫法,“变量提升” 改为 “标识符提升” 更准确.因为变量一般指使用 var 声明的标识符,JS 里使用 function 声明的标识符也存在提升( ...

随机推荐

  1. MySQL8.0的下载与安装

    下载 进入官网的下载页面 点击下图中的链接 可以选择上边的 Community Server ,那样会下载压缩包,这里我选择下边的 Installer for Windows ,下载的是安装包 点击下 ...

  2. Java中常见的转义字符

    转移字符对应的英文是escape character  , 转义字符串(Escape Sequence)字母前面加上捺斜线"\"来表示常见的那些不能显示的ASCII字符.称为转义字 ...

  3. 分布式抽奖秒杀系统,DDD架构设计和实现分享

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.用大项目,贯穿知识体系 写CRUD.堆API.改屎山⛰,熬多少个996也只是成为重复的螺丝 ...

  4. Windows环境下使用Linux命令

    1.说明 如何在Windows环境下使用Linux命令, 这是一个屡见不鲜的问题, 而且已经有很多解决方法, 下面仅推荐几个我觉得好用的工具, 这些工具可能就是我们常用的软件, 而且已经在Window ...

  5. 黑客帝国纯js版

    明天就回家过年了,今天没什么心思上班,看了下博客,发现一个黑客帝国额js版本,地址:https://blog.csdn.net/zhongyi_yang/article/details/5384180 ...

  6. PHP 的扩展类型及安装方式

    扩展类型 底层扩展(基于C语言): PECL 上层扩展(基于PHP 语言): PEAR Composer PECL # 查找扩展 $ pecl search extname # 安装扩展 $ pecl ...

  7. Python 利用@property装饰器和property()方法将一个方法变成属性调用

    在创建实例属性时,如果直接把实例属性暴露出去,虽然写起来简单,但是存在一些风险,比如实例属性可以在外部被修改. 为了限制外部操作,可以通过一个set_score()方法来设置成绩,再通过一个get_s ...

  8. JS 在使用hasOwnProperty()函数时报错

    在使用hasOwnProperty()方法判断对象是否具有某种属性时eslint报下列错误: Do not access Object.prototype method 'hasOwnProperty ...

  9. Spark词频前十的统计练习

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6815390070254600712/ 承接上一个文档<Spark本地环境实现wordCount单词计数> ...

  10. elasticsearch之集成中文分词器

    IK是基于字典的一款轻量级的中文分词工具包,可以通过elasticsearch的插件机制集成: 一.集成步骤 1.在elasticsearch的安装目录下的plugin下新建ik目录: 2.在gith ...