关于JS解析机制、作用域的一些总结

JS语句是怎么解析的(同一个作用域)
首先会全局查找(预解析) var、function 提升其优先级:

alert(a);
var a = 1;
是这么解析的:
var a;
alert(a);
a = 1;
所以结果是 undefined
1、所有的变量在正式代码运行之前,都是undefined
2、所有的函数在正式代码运行之前,都是函数块(域)

其次解读代码:
一些表达式(+-=*%!等)
表达式可以修改预解析的值
函数调用

遇到函数域或者一个新的域 又会重复做首先、其次的动作

作用域链查找规则:自上而下(一个或多个script),由里到外查找(函数中)

一些例子:

if\for语句都不会生成新的作用域,FF下有这样一个bug ——不可以对if 语句下的函数进行预解析,所以不要在这if\for语句中定义变量或者函数

经典问题再现:

为什么 i的值是3,而不是0,1,2?

for语句是不存在款级作用域,按照js的预解析机制,当for语句执行完毕之后,再解析 onclick函数的块级作用域,此时for循环完毕,所以onclick函数内的obj[3]是undefined。



闭包相关问题

了解js垃圾回收机制:函数内部定义的变量在函数调用后,被释放回收;假如函数内部还定了函数,并且引用了变量,此时这些变量不会被回收;

闭包定义:函数嵌套函数,内部函数引用外部函数的变量或参数,这些变量或参数不会被收回
作用:
1、希望变量长期驻扎在内存中
2、避免全局变量污染
3、私有成员存在
用法:
1、模块化代码

2、在循环中找到对应元素的索引(解决上面的经典问题)

时间: 2024-08-13 07:10:35

关于JS解析机制、作用域的一些总结的相关文章

js---07 js解析器作用域

js解析器首先不会逐行读代码,这是第二部了. 首先 根据var找到变量,根据function找函数,找到变量var a = 1,js解析器只会读取等号前面的var a,并把a设置值未定义,并不会读取等号后面的a = 1,所以a的值是未定义,并加入仓库,根据function找到函数后,function a (){ alert(2); },找到函数是函数整体,这是js的预解析(预解析只找var 和函数).遇到重名的留下后面的,变量和函数重名了,函数在后面,只留下函数. 正式读取代码的时候,是从上到下

JS解析机制

变量和函数的声明在js预编译器被处理,而变量的初始化过程和函数的执行发生在执行期,执行期JS解析器按照代码顺序进行解析执行. 在函数声明之前调用函数也是合法的. f(); //返回值1 function f() { alert(1); } 但是按照下面方式声明函数,JS解释器会报语法错误. f(); //返回语法错误 var f = function() { alert(1); } 虽然变量和函数的声明可以放在文档的任意位置,但是良好的编程习惯应该是在JS代码之前声明全局变量和函数并为全局变量初

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

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

JS的解析机制

JS的解析机制,是JS的又一大重点知识点,在面试题中更经常出现,今天就来唠唠他们的原理.首先呢,我们在我们伟大的浏览器中,有个叫做JS解析器的东西,它专门用来读取JS,执行JS.一般情况是存在作用域就存在解析,那它是怎么运行的呢.首先呢,然后分成两大步骤. 1 第一步叫做JS预解析,这一步骤实际上是一种准备工作把,在执行之前,它会先浏览整个代码,然后寻找三种东西. 1var  2 函数声明    我来分别解释一下.首先它会提取带var声明的变量,然后放到作用域中,但是不会提取变量的值,会先给他赋

js学习笔记5----作用域及解析机制

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

作用域,作用域链,垃圾收集,js解析

变量中包含基本数据类型和引用数据类型,基本类型指简单的数据值,引用类型由多个值构成的对象. 引用类型可以为其添加属性和方法,也可以改变和删除属性和方法. 复制变量值: 基本类型:一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,并把该值分配到新变量分配的位置上,两者任何操作不会互相影响. 引用类型:当一个变量向另一个变量复制引用类型的值时,同样也会存储在变量的值复制一份放到位新变量分配的空间中,但是不同的视,这个值的副本只是一个指针,而这个指针指向存储在堆中的一个对象,两个变量引

js全局变量与局部变量 预解析与作用域链详解

局部变量和全局变量同名时,会隐藏这个全局变量: 4.变量 关键字: 4.变量 4.1 变量的类型 JS是松散类型的语言 4.2 变量的声明 var 声明是变量的标准声明 var 声明的变量是永久性的,不能用delete运算符删除 全局对象,调用对象初始化时,JS解析器会在相应的代码段里寻找var声明的变量, 然后在全局对象,调用对象中创建相应的属性,此时它是未赋值的(undefined), 当程序执行到相应的var声明代码段时才会给相应对象的属性赋值 重复的声明:根据以上var声明作用的理解,重

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

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

javascript预解析和作用域

JavaScript解析过程分为两个阶段: 一是:编译阶段.就是JavaScrip预解析阶段,在这个阶段JavaScript解析器将完成把JavaScript脚本代码转换到字节码; 二是:执行阶段.在编译阶段JavaScript解析器借助执行环境把字节码生成机械码,并顺序执行; 预解析:在当前的作用域中,js代码执行之前浏览器会默认把所有带var 和function的进行提前的声明或者定义; eg:var num=1; sum(); function sum(){console.log(num)