JavaScript作用域问题:预解析、全局与局部作用域解析、作用域链

要想了解JS作用域问题,就要先了解浏览器的JS解析器的工作方式,当浏览器读到script脚本代码时,JS解析器便开始工作。其工作步骤主要分为两部分:

JS解析器:

1.“找一些东西”(预解析):var function 参数

例:

alert(a); //undefined

var a=1;

alert(a); //1

function fn1(){alert(2);}

JS解析器会先找到var function 参数进行预解析。

找到var定义的变量a时,解析为a = 未定义,不会读取具体值。换句话说,所有的变量,在正式运行之前,都提前赋了一个值——未定义。

读到funtion时,解析为:fn1=function fn1(){ alert(2);}。所有的函数,在正式运行代码之前,都是整个函数块

2.逐行解读代码:

JS解析器在正式读取JS代码时,会先读取预解析得出的结果,所以本例会首先弹出undefined, 当正式读到a=1时,就会修改预解析时得到的值,此时弹出a的值就为1。

例:

1

alert(a); //报错

a=1;

1

注:因为a没有var声明,所以预解析不到a的值,正式读取代码时找不到a,浏览器会报错。

以下是一些具体例子,会逐步加深对作用域的理解:

例:

alert(a); //function a(){ alert(4);}

var a=1;

alert(a); //1

function a(){ alert(2);}

alert(a); //1

var a=3;

alert(a); //3

function a(){ alert(4);}

alert(a); //3

a(); //报错,最后解析器中保存的是3

分析:

预解析过程:

a=...,

a=function a(){ alert(2);}

a=...,

a=function a(){ alert(4);}

注:浏览器首先进行预解析,预解析结果如上方所示。浏览器在进行预解析时,遇到重名的变量和函数时,会留下函数;遇到重名的多个函数时,会留下后声明的函数。当正式读到代码时,就会修改预解析时保存的值,要记住表达式会修改预解析的值,但函数声明不会修改预解析的值。

例:

var a=1;

function fn1(){

alert(a);

var a=2;

}

fn1(); //undefined

alert(a); //1

分析:

预解析: a=未定义;

fn1=function fn1(){

alert(a);

var a=2;

}

逐行读代码: a=1;

预解析: a=未定义;

逐行读代码:a=2;

本例会进行两次预解析,如上所示,函数内定义的变量只在函数内起作用,所以最后弹出a的值为1。

例:

var a=1;

function fn1(){

alert(a);

a=2;

}

fn1(); //1

alert(a); //2

分析:此处函数内的a未用var声明,预解析函数时找不到任何a的信息,所以会跳到作用域外去找a,这称作作用域链,此时a=1.

例:

var a=1;

function fn1(a){

alert(a);

a=2;

}

fn1(); //undefined

alert(a); //1

分析:函数参数a相当于var a=…,所以函数进行预解析时a=未定义

1. 预解析:

a=...,

function fn1(a){

alert(a);

a=2;

}

2.逐行读代码:

全局a=1;

函数调用:预解析a=...;逐行读代码a=2,但函数外部全局变量a值不变

例:

var a=1;

function fn1(a){

alert(a);

a=2;

}

fn1(a); //1:这个参数来自于全局量a=1;

alert(a); //1

注:在执行函数时,会先从函数参数开始读取代码,所以参数a被赋值为1.

原文地址:https://www.cnblogs.com/tongguilin/p/12230156.html

时间: 2024-11-13 08:20:47

JavaScript作用域问题:预解析、全局与局部作用域解析、作用域链的相关文章

javascript里面的闭包,作用域,预解析

函数的作用域 1.全局变量=公用卫生间 2.局部变量=次卧卫生间      局部变量 全局无法使用      局部声明变量不加var的话就变成全局变量(不推荐使用) 3.闭包=次卧的可以用自己的卫生间,也可以用公用卫生间: 预解析 1.先把变量声明 全部提前,赋值不动 2.函数也有预解析,直接提前   3.预解析 不会脱离函数作用域,也不会冲出script标签 最多提到自己标签的顶部 代码执行顺序 见一个srcipt解析执行一个,执行完了 在执行下一个 案例1:      alert(a);  

JavaScript中作用域和预解析

作用域以及预解析 在javascript中作用域是非常重要的,本文章将会说明作用域以及我们在工作,以及面试中的一些面试题,如果有不足的地方希望大家可以评论指出来,自己一定会及时的改正错误,避免大家走入一些误区. 谈及作用域先就必须要说明预解析和词法作用域. 下面我们先说明一下: 预解析 代码在正常执行操作之前会对文档进行一次解析,这个操作就是将声明提升, 声明包括全局范围内 1.带有var的变量, 2.函数 文档预解析后会把文档中在全局函数中的内容储存起来,将全局中带有var的变量(var和变量

关于作用域和预解析的不常见重要知识

作用域和预解析 在javascript中作用域是非常重要的,本文章将会说明作用域,如果有不足的地方希望大家可以评论指出来,自己一定会及时的改正错误,避免大家走入一些误区. 谈及作用域先就必须要说明预解析和词法作用域. 下面我们先说明一下: 预解析 代码在正常执行操作之前会对文档进行一次解析,这个操作就是将声明提升, 声明包括全局范围内  1.带有var的变量, 2.函数 文档预解析后会把文档中在全局函数中的内容储存起来,将全局中带有var的变量(var和变量名,注意:变量体不会随着提升,加载va

JavaScript有关作用域和预解析

作用域:使用范围 全局变量:声明的变量是使用var声明的,那么这个变量就是全局变量,全局变量可以在页面的任何位置使用 除了函数以外,其他的任何位置定义的变量都是全局变量 局部变量:在函数内部定义的变量,是局部变量,外面不能使用 全局变量,如果页面不关闭,那么就不会释放,就会占空间,消耗内存 全局作用域:全局变量的使用范围 局部作用域:局部变量的使用范围 块级作用域:一对大括号就可以看成是一块,在这块区域中定义的变量,只能在这个区域中使用,但是在js中在这个块级作用域中定义的变量,外面也能使用;

小白学js第六天之代码规范,作用域以及预解析

目录 代码规范 命名规范 变量规范 注释规范 空格规范 换行规范 作用域 全局变量 局部变量 块级作用域 作用域链 预解析 什么是预解析 变量提升 此篇木有脑图,嘻嘻 代码规范 命名规范 变量.函数的命名必须要有意义 变量一般用名词 函数一般用动词 变量规范 操作符前后要有空格 var name = 'zs'; 注释规范 // 这里是注释 空格规范 if (true) { } for(var i = 0; i < n; i++ ) { } 换行规范 var arr = [1, 2, 3, 4];

作用域,预解析,对象,内置方法 Math Date Array

作用域 一段程序代码中所用到的名字并不总是有效可用的,而限定这个名字(变量)的可用性的代码范围,就是这个名字的作用域,作用域提高了逻辑程序的局部性,增强了可靠性,减少了名字冲突: JavaScript作用域(es6)之前:全局作用域,局部作用域 全局作用域:整个script标签或者是一个单独的JS文件 局部作用域(函数作用域):在函数内部就是作用域: 变量作用域 全局变量:在全局作用域下声明的变量:如果在函数内部没有声明(var)直接赋值的变量也是全局变量 num = 2; 局部变量:在函数内部

JavaScript的变量预解析特性

JavaScript是解释型语言是毋庸置疑的,但它是不是仅在运行时自上往下一句一句地解析的呢?事实上或某种现象证明并不是这样的,通过<JavaScript权威指南>及网上相关资料了解到,JavaScript有“预解析”行为.理解这一特性是很重要的,不然在实际开发中你可能会遇到很多无从解析的问题,甚至导致程序bug的存在.为了解析这一现象,也作为自己的一次学习总结,本文逐步引导你来认识JavaScript“预解析”,如果我的见解有误,还望指正.池州市贲生工艺品 我们先来看一个例子: var la

作用域和预解析

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

JS全局与局部作用域解析、作用域链(下)

作用域: 域:空间.范围.区域…… 域分为:全局 一般在script标签范围内定义的变量.函数,我们习惯性地叫做全局变量.全局函数 一个script就是一个域,只要是一个域,就会发生:预解析.逐行解读代码 页面上可以写多个script 举个栗子1: <script> alert(a); </script> <script> var a = 1; </script> JS 会一块一块进行解析.执行,是单线程的 执行第一块时,会先在那个仓库找a:找不到a,就报错