function——函数声明头的提升和预解析
函数:
即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
function——函数声明头的提升和预解析的更多相关文章
- javascript:变量声明&&赋值的提升和函数声明&&定义的提升在不同情况下的表现
console.log(a); //undefined console.log(show); //函数的定义 show(); //aaa123 var a = 1; function ...
- javascript:function 函数声明和函数表达式 详解
函数声明(缩写为FD)是这样一种函数: 有一个特定的名称 在源码中的位置:要么处于程序级(Program level),要么处于其它函数的主体(FunctionBody)中 在进入上下文阶段创建 影响 ...
- Javascript 的变量提升与预解析
一.什么是变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分 二.怎么实现 ...
- JavaScript函数之作用域 / 作用链域 / 预解析
关于作用域和作用链域的问题,很多文章讲的都很详细,本文属于摘录自己觉得对自己有价值的部分,留由后用,仅供参考,需要查看详细信息请点击我给出的原文链接查看原文件 做一个有爱的搬运工~~ -------- ...
- JavaScript--函数表达式与函数声明的区别
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JS中的函数声明和函数表达式的区别,即function(){}和var function(){},以及变量提升、作用域和作用域链
一.前言 Uncaught TypeError: ... is not a function function max(){}表示函数声明,可以放在代码的任何位置,也可以在任何地方成功调用: var ...
- JavaScript 之有趣的函数(函数声明、调用、预解析、作用域)
前言:“函数是对象,函数名是指针.”,函数名仅仅是指向函数的指针,与其他包含函数指针的变量没有什么区别,话句话说,一个函数可能有多个名字. -1.函数声明,function+函数名称.调用方法:函数名 ...
- jacascript 函数声明、函数表达式与声明提升(hoisting机制)
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 声明.定义.初始化 声明的意思是宣称一个变量名的存在,定义则为这个变量分配存储空间,初始化则是给该变量名的 ...
- JS中的提升(即变量和函数声明移动到代码顶部)
先看代码(第一个代码片段): console.log(a); var a = 1; 如果你认为这是一段不合法的代码,在调用console.log()的时候会输出undefined,你完全正确.但是如果 ...
随机推荐
- Outlook2010规则:尝试操作失败,找不到某个对象
可以尝试通过清除规则的方法 启动 Outlook 并删除基于客户端的规则:outlook /cleanclientrules 如果失败,再执行这句 启动 Outlook 并删除基于服务器端的规则:ou ...
- uva 1658 Admiral 【 最小费用最大流 】
拆点,每个点拆成 i,i' 在i 和i‘之间连一条费用为0,容量为1的边,就可以保证每个点只经过一次 特殊的点,1和n之间,,,n和2*n之间连一条费用为0,容量为2的边,可以求出两条路径 #incl ...
- 【技术累积】【点】【java】【3】编译和反编译
闲聊 擦,打脸了,但打完了还是得继续写呗,水着水着看呗. 概述 理解的不深入,但是实用. 总而言之:编译,是将书写的代码翻译为机器能够理解的代码:反编译,则是相反的过程. 来源在于语言的等级,一般认为 ...
- c++ socket C/S通信实例
具体的实例连接: 客户端项目连接:http://pan.baidu.com/s/1c2MndTI 服务端项目连接:http://pan.baidu.com/s/1i4DFkFV 用vs2013打开,服 ...
- /proc/vmstat 详解
参考 #cat /proc/vmstat nr_free_pages 20223354 nr_alloc_batch 899 nr_inactive_anon 393025 nr_active_ano ...
- 简单JavaScript小程序
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- 分析Ajax来爬取今日头条街拍美图并保存到MongDB
前提:.需要安装MongDB 注:因今日投票网页发生变更,如下代码不保证能正常使用 #!/usr/bin/env python #-*- coding: utf-8 -*- import json i ...
- 配置mysql允许远程访问
1.进入 mysql: /usr/local/mysql/bin/mysql -u root -p 2.使用 mysql库 : use mysql; 3.查看用户表 : SELECT `Host`,` ...
- Orcale-利用闪回恢复数据方法
一.delete误删 方法1:如果表结构没有改变,直接闪回整个表,具体步骤: --首先需要表闪回权限,开启行移动功能 alter table 表名 enable row movement; --执行闪 ...
- MySQL 利用binlog增量备份+还原实例
一,什么是增量备份 增量备份,就是将新增加的数据进行备份.假如你一个数据库,有10G的数据,每天会增加10M的数据,数据库每天都要备份一次,这么多数据是不是都要备份呢?还是只要备份增加的数据呢,很显然 ...