函数:

即function语句的集合,就是将多个语句封装到一起;

函数的执行要会自己遍历,遇见函数 a();执行语句,就要移交控制权,函数执行完毕之后,控制权又移交回来了!

函数的参数要罗列在function定义的圆括号内sum(a,b),用逗号隔开,叫做形式参数,调用的时候,圆括号里面是实际参数sum(1,2),参数在JS中不用指定类型,调用的时候参数个数也可以和定义的时候不一样。

1        //函数的参数和返回值
2        function sum(a,b){
3            return a   b;
4            alert("我不会执行,因为我在return后面");
5        }
6
7        //矮化为表达式了console.log(sum(1,2)); 

函数声明头的提升

  函数声明头的提升,程序一开始就会有一个预解析的过程,程序会通看全部代码,把所有的函数名字都放到开头预习一下,程序自己知道了,页面上有这个函数定义。但是,函数表达式是不能预解析的。

敲黑板!!!

函数表达式:如var a = function(); 。

function没有名字,只是个匿名函数,a不是函数的名字,变量a是匿名函数的一个引用而已!!!

//函数声明头的提升
        a1();       a2();function a1(){alert("11111111");}//函数表达式是不能预解析的var a2 = function(){alert("22222222");}

a1()会正常弹窗!

a2()会报错;函数表达式是不能被预解析的(划重点要考)


函数优先

如果同一个标识符,在程序中又是变量的名字,又是函数的名字,解析器会把标识符给函数。

    a();var a=1;function a(){alert("我优先");}

在a();之前函数已经把function a();预解析了。a就是函数了,虽然变量a也有一个变量声明头的提升,但是干不过函数声明头的提升,所以a()就会执行函数;


    var a=1;function a(){alert("我能被执行了吗?");}a();

1.在执行var a = 1之前,函数已经把function a()预解析了,程序就已经知道页面上有一个函数叫做a。

2.但是开始执行程序之后,定义了一个变量a,所以标识符a,就又变成变量了。

3.遇见function定义,程序会无视,因为已经预解析了。直到a()运行的时候,a就是变量,无法运行,报错。

上面三点可能有点绕,需要慢慢理解,仔细琢磨!

         var a=1;var a= function(){alert("你猜我能被执行了吗?");}a();        

有没有想过,这种写法竟然可以被执行,?????

因为上文提到函数表达式 var a= function()  是不会被预解析的,程序刚运行时a是一个变量,后来又遇见一个函数的引用a;所以最后这个标识符a就是函数;


          a();var a=1;var a= function(){alert("如果这样写呢?");}

    console.log(a);var a=1;var a= function(){alert("如果这样写呢?");}

函数表达式是不会预解析的,所以预解析的就是变量a的定义,就是undefined,undefined是无法执行的。


如有不当之处,敬请留言指正!

尊重原创,转载请注明出处https://www.cnblogs.com/lshdashi/p/9441230.html

更多专业前端知识,请上 【猿2048】www.mk2048.com

function——函数声明头的提升和预解析相关推荐

  1. Javascript第四章变量的提升和预解析方法流程第四课

    更多免费教学文章请关注这里 首先我们写一个代码: 解析前代码: 预解析(全局)后代码: 第二步:一行一行的执行代码 第三步:当执行函数时,再次进行预解析 局部作用域依然跟第一步一样解析 解析后: 放到 ...

  2. 解释变量提升(预解析)

    找var function 参数 逐行执行代码 找var 的时候,如果存在var关键字,则会将这个变量先存储下来,存储的形式为var a=undefined ,预解析的时候,变量中存的都是undefi ...

  3. js变量提升_学习笔记:JS中的作用域和预解析

    知识总结:谢静贤.汤昊 在javascript中作用域是非常重要的,本文将会说明作用域以及我们在工作,以及面试中的一些面试题,如果有不足的地方希望大家可以评论指出来,自己一定会及时的改正错误,避免大家 ...

  4. 函数声明与函数表达式的提升问题

    首先上图 函数a是函数声明,执行的是函数提升,实际效果是 function a() {console.log(1); } a(); 即会把整个函数声明提到作用域顶端 而函数b是函数表达式,执行的是变量 ...

  5. JS函数声明和预解析的理解

    JS函数声明方法 今天看到了一个自己关注了的大神给我回了私信,觉得自己仿佛摸到了大神的裤腿,哈哈,而且人还特别好,居然会给小菜鸟回私信,特别开心呀,一个菜鸟的小激动,言归正传啦 1.最为常见的函数声明 ...

  6. 【Web前端培训】预解析(变量提升)

    今天千锋小编为大家介绍一下一下JavaScript中的预解析(变量提升).从什么是预解析及变量的预解析和函数的预解析及加载流程进行学习(注意:我们这里说的ES5中的预解析). 什么是解析 首先代码执行 ...

  7. JavaScript中的预解析(变量提升)介绍!

    今天小千为大家介绍一下JavaScript中的预解析(变量提升).从什么是预解析及变量的预解析和函数的预解析及加载流程进行学习(注意:我们这里说的ES5中的预解析). 什么是解析 首先代码执行肯定需要 ...

  8. this指向-作用域、作用域链-预解析 变量提升-Vue组件传值 父子 子父 非父子-Vue数据双向绑定原理

    目录 this指向 作用域.作用域链 预解析 变量提升 Vue组件传值 父子 子父 非父子 Vue数据双向绑定原理 1.this指向 函数的this指向 看调用.不看声明 (1)普通函数调用 ①函数名 ...

  9. js函数声明和函数表达式的区别

    Javascript Function无处不在,而且功能强大!通过Javascript函数可以让JS具有面向对象的一些特征,实现封装.继承等,也可以让代码得到复用.但事物都有两面性,Javascrip ...

最新文章

  1. 转:Jquery AJAX POST与GET之间的区别
  2. [IOS] Storyboard全解析-第一部分
  3. java 分贝_java11教程--jhsdb命令
  4. matlab cell转数组_MATLAB批量修改文件名
  5. Notes of fwt
  6. 文献阅读005【精读】
  7. dalvik on J2EE: running tomcat on dalvik
  8. Web渗透测试-实战 方法 思路 总结
  9. 第一章c语言入门,linux C语言程序设计 从入门到放弃——入门第一章
  10. LaTex下载与安装教程(一切为了学术~)
  11. OpenCV IplImage图片结构
  12. sicilyOJ 09广东省赛重现H Westward Journey Online(线段树)
  13. 2021年危险化学品经营单位主要负责人试题及解析及危险化学品经营单位主要负责人理论考试
  14. IBM Spectrum LSF-手册
  15. 为什么我玩游戏那么卡?
  16. LaTeX中参考文献的整理
  17. ElasticSearch实战系列02:中文+拼音混合检索,并高亮显示
  18. 破解一个已经连接好的数据库密码
  19. 点击次数、访问次数、访问者人数、综合浏览量和唯一浏览量有何区别?(转)...
  20. VS2019/MFC编程入门——文档、视图和框架:分割窗口

热门文章

  1. 传智杯Java终端有一天您厌烦了电脑上又丑又没用的终端,打算自己实现一个 Terminal
  2. win mysql 2003错误_windows MySql 报1067错误 2003错误
  3. IP地址分类及ISO-OSI、三次握手
  4. # 管道已结束_县城这条路启用自来水新管道,看看是否在你家附近...
  5. Python语言 目录
  6. django定时任务
  7. IOS-状态栏的简单操作
  8. Gentoo man手册指南
  9. mysql my.cnf在哪里_my.cnf配置文件在哪
  10. inline用法详解