javascript预解析详解

1、定义

预解析:在当前作用域下,js运行之前,会把带有var和function关键字声明的变量先声明,并在内存中安排好。然后从上至下解析js语句。而且function的声明优先于var声明。

2、var声明

通过var声明的变量,进行预解析的时候:先声明变量,不管变量有没有赋值,声明时都赋值为undefined。

console.log(a); //undefined
var a = 1;
console.log(b); //undefined
var b = function(){}
1
2
3
4
5
注意:
(1)同名的var声明和同名的函数声明,不管二者书写先后顺序,函数声明会覆盖掉var声明的变量;
(2)同名的var声明,后者会被忽略;
(3)同名的函数声明,后者会覆盖前面的

console.log(a) //function a(){}
var a = 10;
console.log(a) //10
var a = 20;
console.log(a) //20
var a = function () {
// body...
}
console.log(a) //function(){}
function a(){}
console.log(a) //function(){}
/*若在此处加下面的声明*/
/*
function a(name){this.name = name}
*/
//则最上面的a输出:function a(name){this.name = name}

3、function声明

function进行预解析的时候,不仅是声明而且还定义了函数体,在内存中会开辟一块内存空间,存储的是函数体的字符串,不会执行。调用以后执行。

console.log(a) //function a(name){this.name = name}
function a(name){this.name = name}
1
2
注意:直接在函数后面加(),会报错。这样的函数声明时,先声明函数,然后声明(),这个()是匿名函数,声明会报错

function a(){}() //报错
1
注意问题

(1)预解析,不会超出script标签

<script>
console.log(a) // 报错
</script>
<script>function a(){}</script>
1
2
3
4
(2)后面script标签中可以访问呢前面script标签中的js,因为js是从上至下执行的

<script>
function a(){}
var a = 10
</script>
<script>
console.log(a) //10
</script>
1
2
3
4
5
6
7
(3)匿名函数可以带名字,但是不等同于定义了一个函数

console.log(a) //undefined
fn() //报错
var a = function fn (argument) {
// body...
}
1
2
3
4
5
(4)函数内部同名变量额声明高于传入的同名参数

var a = 10
function fn(a){
var a = 20
console.log(a)//20
}
fn(a)
1
2
3
4
5
6
var a = 10
function fn(a){
console.log(a)//undefined
}
fn() //因为调用时,没有穿参数
1
2
3
4
5
(5) 函数内参数的声明高于外部同名变量的声明

var a = 10
function fn (a){
console.log(a)//undefined
}
fn()
1
2
3
4
5

var a = 10
function fn (b){
console.log(a) // 10
}
fn()
//因为函数的形参是b,函数内的参数是a  不一样,所以还是  寻找全局变量a
或者

var a = 10
function fn (){
console.log(a) // 10
}
fn()
//因为函数没有传参数  寻找全局变量a

原文地址:https://www.cnblogs.com/urlvue/p/9905992.html

时间: 2024-08-02 19:49:36

javascript预解析详解的相关文章

代码示例:一些简单技巧优化JavaScript编译器工作详解,让你写出高性能运行的更快JavaScript代码

告诉你一些简单的技巧来优化JavaScript编译器工作,从而让你的JavaScript代码运行的更快.尤其是在你游戏中发现帧率下降或是当垃圾回收器有大量的工作要完成的时候. 单一同态: 当你定义了一个两个参数的函数,编译器会接受你的定义,如果函数参数的类型.个数或者返回值的类型改变编译器的工作会变得艰难.通常情况下,单一同态的数据结构和个数相同的参数会让你的程序会更好的工作. function example(a, b) { // 期望a,b都为数值类型 console.log(++a * +

JavaScript 运行机制详解

JavaScript 运行机制详解——转载: 一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. JavaScript的单线程,与它的用途有关.作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM.这决定了它只能是单线程,否则会带来很复杂的同步问题.比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另

android Json解析详解

JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语 言的支持),从而可以在不同平台间进行数据交换.JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为– Json.org JSON Vs XML 1.JSON和XML的数据可读性基本相同 2.JSON和XML同样拥有丰富的解析手段 3.JSON相对于XML来讲,数据的体积小 4.JSON与JavaScript的交互更加方便

[转]JavaScript异步机制详解

原文: https://www.jianshu.com/p/4ea4ee713ead --------------------------------------------------------------------------- 学习JavaScript的时候了解到JavaScript是单线程的,刚开始很疑惑,单线程怎么处理网络请求.文件读写等耗时操作呢?效率岂不是会很低?随着对这方面内容的了解和深入,知道了其中的奥秘.本篇文章就主要讲解一下JavaScript怎么处理异步问题. 一.同

轻松搞定javascript预解析机制(搞定后,一切有关变态面试题都是浮云~~)

hey,guys!我们一起总结一下JS预解析吧! 首先,我们得搞清楚JS预解析和JS逐行执行的关系.其实它们两并不冲突,一个例子轻松理解它们的关系: 你去酒店吃饭,吃饭前你得看下菜谱,点下菜(JS预解析),但吃的时候还是一口一口的吃(JS逐行执行)! OK,解决下面五个问题,JS预解析就算过了~~(前提:对JS变量作用域有清晰理解) 一.JS预解析是什么? 其实就是对程序要用到的材料(变量,函数)给一个初始值,并存到一个表中(我自己虚构的),当程序运行到那一行时,就来这个表看有没有初始值,没有就

Javascript 严格模式详解

Javascript 严格模式详解 作者: 阮一峰 日期: 2013年1月14日 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Javascript在更严格的条件下运行. 设立"严格模式"的目的,主要有以下几个: - 消除Javascript语法的一些不合理.不严谨之处,减少一些怪异行为; - 消除代码运行的一些不安全之处,保证代码运行的安全: - 提高编译器效率,增加运行速度

ini格式数据生成与解析详解

ini格式数据生成与解析详解 1.ini格式数据长啥样? 2.ini格式数据简介 INI文件的命名来源,是取自英文"初始(Initial)"的首字缩写,正与它的用途--初始化程序相应. 有时候,INI文件也会以不同的扩展名,如".cfg".".conf"(在Linux系统中也常用到).或是".txt"代替(从辨识度的角度,不建议使用). 3.ini格式数据适用场景 INI文件是一个无固定标准格式的配置文件.它以简单的文字与简单

我看朴灵评注阮一峰的《JavaScript 运行机制详解:再谈Event Loop》

阮一峰和朴灵对我来说都是大牛,他们俩的书我都买过,阮老师的译作<软件随想录>和朴灵的<深入浅出node.js>.这个事情已经过了4个月了,所以我拿来讲应该也没啥问题. 这件事情是这样的,阮一峰在自己的博客写了篇文章<JavaScript 运行机制详解:再谈Event Loop>,然后朴灵看见了,发现了很多问题,然后在印象笔记又写了篇文章<[朴灵评注]JavaScript 运行机制详解:再谈Event Loop>,由于印象笔记现在已经不能访问了(尼玛也太烂了)

JavaScript 预解析

通过<JavaScript权威指南>及网上相关资料了解到,JavaScript有“预解析”行为.理解这一特性是很重要的,不然在实际开发中你可能会遇到很多无从解析的问题,甚至导致程序bug的存在.为了解析这一现象,也作为自己的一次学习总结,本文逐步引导你来认识JavaScript“预解析”,如果我的见解有误,还望指正. (1)如果JavaScript仅是运行时自上往下逐句解析的,下面的代码能正确运行是可以理解的,因为我们先定义函数,然后才调用它. 复制代码代码如下: function showM