两个实例轻松理解js函数预解析
js函数预解析
- 例子1:
- 先上一段代码,看看能不能写出最终的执行结果.
console.log(a);
var a = 1;
console.log(a);
function a(){
console.log(2);
}
var a = 3;
console.log(a);
function a(){
console.log(4);
}
console.log(a);
a();
运行结果:

解释一下:
- 首先预解析阶段遇到 var a = 1;声明变量a
- 然后遇到第一个函数a声明,这时由于和变量a重名,故将变量a替代,此时a表示一个函数
- 然后遇到var a = 3;变量a干不过函数a,a代表的还是一个函数
- 最后又遇到第二个函数a声明,后面函数a声明替换前面的,a还是代表一个函数但是函数体内容发生了变化
注意: 预解析阶段的变量可以理解为都被赋值为undefined,函数就是函数体的内容,当遇到变量名a和函数名a一致时,预解析完后a是函数a,里面存放的是函数体的内容,函数a和函数a同时出现时,后面声明的函数还会覆盖前面声明的函数。
故:
console.log(a); //输出函数a,函数体内容是第二个函数声明
var a = 1; //经过赋值之后,函数a变为了变量a,并且值为1
console.log(a);//1
function a(){
console.log(2);
}
var a = 3;//变量a变为3
console.log(a);//3
function a(){
console.log(4);
}
console.log(a);//3
a();//a现在是一个变量,当然会报错
- 例子2
var a =1;
function fn(a){
console.log(a)
a = 2;
}
fn():
console.log(a);
运行结果:

主要想说明的一点就是function fn(a) 就相当于function fn(var a),因此预解析阶段是有对这个函数内部的a的预解析的,因此在函数内部输出的a为undefined而没有报错。
将上面的例子稍微改动一下
var a =1; function fn(a){ console.log(a) a = 2; } fn(a): //将a的值传递进去 console.log(a);运行结果:

将a当作实参传递进去之后,局部变量a的值变为1,再函数内部将a变为2,但是在外部输出时输出的是全局作用域下的a,因此还是1.
注意在函数内部a=2;当没有变量a的声明时,那么a=2生成的是全局作用域下的a,但是当函数内部有局部作用域下的a时,a=2仅仅就是赋值的作用。
两个实例轻松理解js函数预解析的更多相关文章
- 怎样理解JS的预解析机制
JS的预解析包括两部分: 1. 变量提升 2. 函数声明 对于变量提升, 可以看下下面这块代码 console.log(name); // undefined var name = "Lil ...
- JS函数预解析(小记)
一,预解析:寻找var function 形参 a=undefined fn = function fn(){ alert(); } 二,逐行解读代码: 1.表达式 2. ...
- js的预解析
在ES6之前,变量使用var声明,会存在变量的预解析(函数也有预解析).ES6引了let和const,但是现阶段ES6并没有完全普及,而且很多比较老的代码都还是按照ES5的标准甚至是ES3的标准来书写 ...
- 深入理解JS函数中this指针的指向
函数在执行时,会在函数体内部自动生成一个this指针.谁直接调用产生这个this指针的函数,this就指向谁. 怎么理解指向呢,我认为指向就是等于.例如直接在js中输入下面的等式: console.l ...
- (day65、66)Vue基础、指令、实例成员、JS函数this补充、冒泡排序
目录 一.Vue基础 (一)什么是Vue (二)为什么学习Vue (三)如何使用Vue 二.Vue指令 (一)文本指令 (二)事件指令v-on (三)属性指令v-bind (四)表单指令v-model ...
- js函数预编译和声明语句被提升问题小结
<!DOCTYPE html><html><head></head><body><script>//-------------- ...
- 轻松搞定javascript预解析机制(搞定后,一切有关变态面试题都是浮云~~)
hey,guys!我们一起总结一下JS预解析吧! 首先,我们得搞清楚JS预解析和JS逐行执行的关系.其实它们两并不冲突,一个例子轻松理解它们的关系: 你去酒店吃饭,吃饭前你得看下菜谱,点下菜(JS预解 ...
- 第112天:javascript中函数预解析和执行阶段
关于javascript中的函数: 1.预解析:把所有的函数定义提前,所有的变量声明提前,变量的赋值不提前 2.执行 :从上到下执行,但有例外(setTimeout,setInterval,aja ...
- js的预解析和作用域
预解析指的就是,在js文件或者script里面的代码在正式开始执行之前,进行的一些解析工作.这个工作很简单,就是在全局中寻找var关键字声明的变量和通过function关键字声明的函数. 1.寻找 v ...
随机推荐
- PostGIS 导入SHP文件并与ArcGIS连接
运行环境: ArcGIS10.4 PostGreSql9.4 PostGIS2.2(需勾选空间数据库,否则需要重新安装) 实现步骤: 方法一: 1.打开pgAdminIII,数据库节点上右键,新建数据 ...
- 2019-11-5:docker拉去配置oracle数据库
转载自:https://www.cnblogs.com/OliverQin/p/9765808.html 1.拉取Oracle11g镜像 docker pull registry.cn-hangzho ...
- 【Luogu P3384】树链剖分模板
树链剖分的基本思想是把一棵树剖分成若干条链,再利用线段树等数据结构维护相关数据,可以非常暴力优雅地解决很多问题. 树链剖分中的几个基本概念: 重儿子:对于当前节点的所有儿子中,子树大小最大的一个儿子就 ...
- Java方法之定义形式及可变参数
目录 Java方法之定义形式及可变参数 方法调用 使用static修饰的方法 没有static修饰的方法 方法的定义格式 无参无返 无参有返 有参无返 有参有返 形参个数可变的方法 采用数组形参来定义 ...
- F#周报2019年第48期
新闻 拥抱可空引用类型 介绍Orleans 3.0 视频及幻灯片 组合的力量 关于.NET:探索新的用于.NET的Azure .NET SDK .NET设计审查:GitHub快速审查 FableCon ...
- 设计模式之建造者模式--PHP
建造者模式:将一个负责对象的构建与它的表示分离,使得同样的构建过程有不同的表示.建造者模式是一步一步创建负责的对象,它允许开发者只通过指定对象的类型和内容就可以创建它们.开发者不需要知道具体的构造细节 ...
- 实战webpack系列02
02. 开始使用webpack 1.1.安装 Webpack可以使用npm安装,新建一个空的练习文件夹(此处命名为webpack sample project),在终端中转到该文件夹后执行下述指令就可 ...
- Vue各种配置
小知识 Vue.prototype和Vue.use的区别 这个是全局可以通过Vue对象获取serring的值 Vue.prototype.$settings = settings; 这个是配置全局环境 ...
- Django ORM-objects-QuerySet
Django ORM ORM执行查看原生SQL的两种方法 1.在setting中配置 LOGGING = { 'version': 1, 'disable_existing_loggers': Fal ...
- python-14-文件操作
前言 python中对文件的读写也是非常方便的,本章节将讲解读.写.读写等常用操作.下面讲师必要的参数: 1.文件路径:必须得知道文件的路径,不然怎样进行读写? 2.编码方式:utf-8,gbk,gb ...