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

原文链接: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. uniapp跳转webview后H5不执行UniAppJSBridgeReady 回调无用

    开始时我在真机上测试使用 <web-view :src="'/hybrid/html/pages/index/index.html?userInfo='+JSON.stringify( ...

  2. MATLAB 错误之生成step图表出错

    m文件: step(Gi_close) hold on 错误示例: 使用step函数生成图表后,报错如下: Plots must be of the same type and size to be ...

  3. dos 之 for循环(小“病毒”)

    需求: 1.自动在D盘下创建test2019文件夹: 2.自动在test2019下面创建100个文件,并写入"这是文件几的内容!": 3.自动打开100个CMD运行窗口(保持打开状 ...

  4. [Flask] Flask问题集(后端模板渲染项目)

    1.redirect和render_template的区别? redirect:重定向,会改变url render_template:模板渲染,用模板来渲染当前页,不会改变url 2.关于 'g' 对 ...

  5. SYCOJ2197三角形游戏

    题目-三角形游戏 (shiyancang.cn) 对于任意的一个数字,把他拆分为n个数字,使得其逐层和为该数字. 首先n很小,所以很可能是搜索.DFS,n回选择. #include<bits/s ...

  6. 移动端开发,rem单位妙用,自适应

    其实我们都会,但是不会用 大家看到的都是,这样的,这样的. http://www.woshipm.com/ucd/24110.html http://www.w3cplus.com/css3/defi ...

  7. Maven插件开发教程

    Maven是一个一个优秀的项目管理开源框架,其插件机制为其功能扩展提供了非常大的便捷性.大多数情况下,我们不需要自己开发Maven插件,因为Maven本身提供了很多便捷的官方插件.但是对于某些特殊场景 ...

  8. XCTF(Web_php_unserialize)

    拿到题目,是个这, 我们来一波代码审计 1 <?php 2 class Demo { 3 private $file = 'index.php'; 4 public function __con ...

  9. Java反射给泛型集合赋值

    Java反射给泛型集合赋值 泛型 Java泛型简单描述下: 比如创建一个List集合,我想在里边只放Student对象信息,就需要写成 List<Student> studentList ...

  10. Java代码批量插入数据到MySQL

    1.批量插入 import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundExc ...