js之预解析

一、所谓的预解析就是:在当前作用域中,JavaScript代码执行之前,浏览器首先会默认的把所有带var和function声明的变量进行提前的声明或者定义。

1)var声明的变量在预解析的时候只是提前的声明,

2)function声明的函数在预解析的时候会提前声明并且会同时定义。

二、预解析只发生在当前的作用域下

  程序最开始的时候,只对window下的变量和函数进行预解析GO{}

  只有函数执行的时候才会对函数中的变量和函数进行预解析AO{}

三、当函数执行的时候,首先会形成一个新的私有作用域AO{},然后按照如下的步骤执行。

  如果有形参,先给形参赋值;

  进行私有作用域中的预解析;

  私有作用域中的代码从上到下执行

四、在全局作用域中声明变量带var可以进行预解析,所以在赋值的前面执行不会报错;声明变量的时候不带var的时候,不能进行预解析,所以在赋值的前面执行会报错。

五、注意:JS中,如果在不进行任何特殊处理的情况下,上面的代码报错,下面的代码都不再执行了

六、不管条件是否成立,都会把带var的进行提前的声明

  if (!(‘num‘ in window)) {

    var num = 12;

  }

  console.log(num); // undefined

七、只预解析“=”左边的,右边的是指针,不参与预解析

var fn = function () { //不会解析

  console.log(‘ok‘);

}

var a = b = 1 //解析的时候只会提升var a 而 b 只是没有声明直接赋值,是全局变量。

八、自执行函数:定义和执行一起完成

  自执行函数定义的那个function在全局作用域下不进行预解析,当代码执行到这个位置的时候,定义和执行一起完成了。

九、return以下的代码依然会进行预解析

  return中的代码,都是我们的返回值,所以不进行预解析。

十、typeof(a) //undefined, 未声明而使用变量 只有typeof不报错,是undefined

十一、!!是将表达式强制转化为bool值的运算,运算结果为true或false,表达式是什么值,结果就是对应的bool值,不再取非。

注:

  ①、所有的变量声明,都会提升到最顶部,但不会提升赋值

  ②、所有的函数声明,都会提升到最顶部,但不会提升函数的调用

  ③、如果同时有多个 var 声明的相同的变量,后面的 var 将被忽略

  ④、如果同时有多个同名的函数,后面的函数将会覆盖前面的函数

  ⑤、如果声明的变量和声明的函数同名,声明的函数将会覆盖声明的变量

原文地址:https://www.cnblogs.com/zjz666/p/11417488.html

时间: 2024-11-10 19:10:17

js之预解析的相关文章

JS代码预解析原理、函数相关、面向对象

JS重要知识点 这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原理(包括三个段落): 函数相关(包括 函数传参,带参数函数的调用方式,闭包): 面向对象(包括 对象创建.原型链,数据类型的检测,继承). JS代码预解析原理 /****************** JS代码预解析原理 ******************//*JS代码预解析.变量作

JS代码预解析原理

/* JS代码预解析.变量作用域.作用域链等 应该能作为学习JS语言的入门必备知识.下边给出些简要解释和一些典型的代码段,若要了解更多,能从网上搜索到更多相关示例. 引用网上的一段有关 "JS的执行顺序" 的解释:如果一个文档流中包含多个script代码段(用script标签分隔的js代码或引入的js文件),它们的运行顺序是:步骤1. 读入第一个代码段(js执行引擎并非一行一行地执行程序,而是一段一段地分析执行的)步骤2. 做语法分析,有错则报语法错误(比如括号不匹配等),并跳转到步骤

2.2、js基础---预解析和严格模式

一.语言特性 1.预解析:js会把变量的声明(仅仅是声明)提到顶部,但是不会突破作用域. alert(a);var a= 12; //结果,undefined 2.页面无论多长都会进行预解析. 3.js语言执行步骤: 读取一个script标签=>预解析=>执行里面代码=>读取下一个script=>预解析=>执行代码 4.函数也有预解析,但是要注意:当以变量的形式声明的函数,预解析会按照变量的特性走,否则不按照. a();//报错了. var a=function(){ ale

js的预解析和代码执行相关规则

JavaScript解析过程分为两个阶段,一个是编译阶段,另外一个就是执行阶段. 1.编译阶段:又称为预解析阶段,在这个阶段JavaScript解释器将完成把JavaScript脚本代码转换到字节码. 2.执行阶段:在执行阶段JavaScript解释器借助执行环境把字节码生成机械码,并顺序执行. 在未定义和函数中,会选择函数,跟代码顺序没有关系 学习博客:http://www.cnblogs.com/HPNiuYear/archive/2012/08/27/2657879.html

JS作用域概念-预解析规则

// 作用域: // 域:空间.范围.区域…… // 作用:读.写 script 全局变量.全局函数 自上而下 函数 由里到外 {} 浏览器: “JS解析器” 1)“找一些东西” :var function 参数 a = ... 所有的变量,在正式运行代码之前,都提前赋了一个值:未定义 fn1 = function fn1(){ alert(2); } 所有的函数,在正式运行代码之前,都是整个函数块 JS 的预解析 遇到重名的:只留一个 变量和函数重名了,就只留下函数 2)逐行解读代码: 表达式

JS预解析

1.在逐行读js代码前,解析器会先提取所有声明的var变量和函数 js解析器会先把脚本里所有var变量声明读一遍,但是它只读变量名字,不读变量值,一开始它会赋给所有读到的var变量一个[未定义]的值.而js解析器提取函数是整块提取的读出来,把函数当作整体来看待,也就是说读变量是没值的,读函数是有内容的.这个过程就是js的预解析 所以在逐行读代码的这一步时,解析器每找到一个var声明,就会去看先前提取的东西中有没有它的值(往往是[未定义]) 2.var a=0; var是声明, a=0是表达式 如

第06课:作用域、JS预解析机制

从字面上理解----域就是空间.范围.区域,作用就是读.写,所以作用域我们可以简单理解为:在什么样空间或者范围内对数据进行什么样的读或写操作. 看一下代码 alert(a); // 为什么是undefined var a = 1; alert(a); //为什么浏览器无反应 a = 1; 要了解为什么这些现象必须先知道浏览器是如何读取js代码,而这段浏览器专门用来读取js代码的片段我们称之为-----js解析器  首先,我们来理解“JS解析器”是如何工作的? 先看如下代码 alert(a); /

js预解析相关知识总结

js的预解析特别有意思,像在做智力题一样有意思~ 预解析 预解析:在解释这行代码之前发生的事情--变量的声明提前了,函数的声明提前 console.log(num) --未定义Num,结果是报错 var num; console.log(num)--结果是undefined console.log(num) var num = 10;--结果是undefined 注意:预解析分段,多对的script标签中如果函数名相同,互不影响 原文地址:https://www.cnblogs.com/code

JavaScript函数之作用域 / 作用链域 / 预解析

关于作用域和作用链域的问题,很多文章讲的都很详细,本文属于摘录自己觉得对自己有价值的部分,留由后用,仅供参考,需要查看详细信息请点击我给出的原文链接查看原文件 做一个有爱的搬运工~~ ------------------------------------------------------------------------------------------------------------------------------------------- 作用域 js中作用域只有一种,就是函