javascript预解析和作用域

鹿晓晓      2022-02-07     351

关键词:

JavaScript解析过程分为两个阶段:

一是:编译阶段.就是JavaScrip预解析阶段,在这个阶段JavaScript解析器将完成把JavaScript脚本代码转换到字节码;

二是:执行阶段.在编译阶段JavaScript解析器借助执行环境把字节码生成机械码,并顺序执行;

预解析:在当前的作用域中,js代码执行之前浏览器会默认把所有带var 和function的进行提前的声明或者定义;

eg:var num=1;

sum();

function sum(){console.log(num)};//1

执行过程:

1.预解析:查找var,找到num变量,按照与解析的规则,变量的预解析是只声明不赋值.

相当于把num变量放在了全局变量仓库里,但是此时的num并没有赋值,值为undefined.

查找function关键字,发现了函数素描,按照与解析的规则,声明并定义,相当于把sum函数放在全局的仓库,并且赋值了.

2.执行:代码从上到下执行,预解析过的直接略过.

*定义函数的方式有函数声明函数表达式两种,通过对预解析机制的简单了解我们可以知道只有函数声明的方式才可以将函数执行写在函数声明之前,而使用函数表达式定义的函数则不能先调用后声明

handel1(); //1 函数声明的方式,函数整体被预解析
function handel1(){
alert(1);
}

handel2(); //Uncaught TypeError: undefined is not a function 函数表达式仅仅将变量名进行了预解析
var handel2 = function(){
alert(1);
}

*简单了解我们可以知道只有函数声明的方式才可以将函数执行写在函数声明之前,而使用函数表达式定义的函数则不能先调用后声明,

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

*由于JS是自上而下的执行顺序,单个script标签内为一个完整的执行域,所以会逐个script标签进行以上两步操作

* 当JS解析器执行代码到fn()执行的时候重新执行预解析过程,如果在执行函数里面的代码的时候没有在执行环境中找到相应变量则会在其父级作用域中寻找,这种方式叫做作用域链.

eg:var a=1;

function fn(){

   alert(a);//1

   a=2;

 }

alert(a);//1

fn();

alert(a);//2

*除了var和function会被预解析之外,函数的参数也会被执行环境预解析:

var a = 1;
function fn(a){
alert(a); //undefined
a = 2; //这里修改的是函数作用域内的局部变量a
}
fn();
alert(a); //1

作用域:

全局作用域:在代码中任何地方都能访问到的对象,

(1)最外层函数和在最外层函数外面定义的变量拥有全局作用域.

eg:var num=1;

     function sum(){console.log(num)};

(2)所有未定义直接复制的变量自动声明为拥有全局作用域,

eg:function sum(){

     var num1=10;//局部变量

      num2=20;//全局变量

    }

(3)所有window对象的属性拥有全局作用域

一般情况下,window对性的内置属性都拥有全局作用域.

局部作用域:一般只在固定的代码片段内可以访问到,最常见的就是函数内部,所以在一些地方也会看到有人把这种作用域称为是函数作用域.

eg:var num=1;//全局作用域

     function sum(number){//number是局部变量

     var num2=2;//局部变量

      console.log(num);//num为全局变量

       num=3;//全局变量

      }

 

 

 

函数有一个内部属性[[Scope]],该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,他决定了哪些数据能被函数访问.























javascript中的作用域预解析以及变量提升(代码片段)

JavaScript中的作用域、预解析以及变量提升作用域:变量的作用范围局部作用域:函数内部在局部作用域声明的变量称为局部变量,局部变量只能在当前函数内部使用1)函数在执行的时候会在内存中开辟新空间2... 查看详情

javascript的作用域链变量提升及预解析(代码片段)

一、javascript的作用域链如果函数中还有函数,或者块级作用域又嵌套块级作用域,那么在这个作用域中就又可以诞生一个作用域,这样的嵌套作用域形成了链状的结果就是作用域链。查找原则:从上到下,从... 查看详情

javascript的作用域链变量提升及预解析(代码片段)

一、javascript的作用域链如果函数中还有函数,或者块级作用域又嵌套块级作用域,那么在这个作用域中就又可以诞生一个作用域,这样的嵌套作用域形成了链状的结果就是作用域链。查找原则:从上到下,从... 查看详情

javascript入门第十八章(js作用域及变量预解析)(代码片段)

1.js作用域1.作用域:变量起作用的范围*2.js中只有两种:全局作用域局部作用域**全局作用域:变量在任何地方起作用*全局变量:在函数外面声明*局部作用域:变量只能在函数内部起作用(又叫块级作用域... 查看详情

javascript——作用域和预解析,深度理解代码执行程序(代码片段)

博主是👦一个帅气的boy,你可以叫我山鱼君🖱⌨个人主页:山鱼君🐟的个人主页💖💖如果这篇文章对你有帮助的话希望三连下👍⭐✍支持一下博主🌊如果有什么建议的话可以在评论区留言... 查看详情

作用域,预解析,对象,内置方法mathdatearray(代码片段)

...了逻辑程序的局部性,增强了可靠性,减少了名字冲突;JavaScript作用域(es6)之前:全局作用域,局部作用域全局作用域:整个script标签或者是一个单独的JS文件局部作用域(函数作用域):在函数内部就是作用域;变量作用域... 查看详情

预编译作用域链和闭包理解

在理解预编译之前,首先了解一下JS的解析过程:JS引擎在解析脚本的过程分为两个阶段,预编译和执行,首先预编译然后再从上之下一行一行的执行代码。其次,要了解作用域,作用域是一个变量或者函数能够使用的空间,分... 查看详情

javascript中---作用域

...核主要有两大功能,一个是渲染页面,另一个就是我们的JavaScript的解释器了。我们主要来说说JavaScript解释器,在解析时是怎么样的工作原理。在解析的时候,首先会发生预解析,就是说不会直接一行一行去执行我们所写的代码... 查看详情

第三节:作用域链

(转自老惠的博客) JavaScript采用的是静态作用域规则,也叫词法作用域,其解析过程是按照从上到下、从左到右的顺序加载,并分为两个阶段:预编译期(预处理)和执行期。预编译期对代码块中所有声明的变量和函数进行处... 查看详情

第三节:作用域链

  JavaScript采用的是静态作用域规则,也叫词法作用域,其解析过程是按照从上到下、从左到右的顺序加载,并分为两个阶段:预编译期(预处理)和执行期。预编译期对代码块中所有声明的变量和函数进行处理。注意关键字... 查看详情

javascript预解析详解

1、定义预解析:在当前作用域下,js运行之前,会把带有var和function关键字声明的变量先声明,并在内存中安排好。然后从上至下解析js语句。而且function的声明优先于var声明。2、var声明通过var声明的变量,进行预解析的时候:先... 查看详情

javascript预编译

...详细讲解一下大家要明白,这个预编译和编译是不一样的JavaScript是解释型语言,既然是解释型语言,就是编译一行,执行一行传统的编译会经历很多步骤,分词、解析、代码生成什么的日后有时间再给大家科普下 查看详情

javascript中作用域和作用域链解析

  学习js,肯定要学习作用域,js作用域和其他的主流语言的作用域还存在很大的区别。一.js没有块级作用域。  js没有块级作用域,就像这样:if(){vara=100;  console.log(a)//输出100}console.log(a)//输出100  js中像if,for... 查看详情

函数作用域中的this问题

首先一起回顾下预解析和作用域吧:  预解析:     浏览器每读到一个script标签或function,先不执行任何代码,会先把整个代码快速的浏览一遍,然后从中挑出var和function两个关键字.     var:预解析遇到var就把var连... 查看详情

vars变量预解析

JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为hoisting(悬置/置顶解析/预解析)。当你使用了一个变量,然后不久在函数中又重新声明的话,就可能产生逻... 查看详情

作用域

...分为两种,一种是全局变量,一种是局部变量浏览器的js解析器对于script内部的内容分为两步1、预解析:找一些东西,如变量var、函数function、参数,所有的变量在执行代码之前都是undefined,所有的函数在执行代码之前都是函数... 查看详情

20-作用域及预解析(代码片段)

...执行、查询、嵌套、异常编译:边解释,便运行分词单元解析成抽象树//编译://1.分词:var,a,=,10/*‘var‘:‘keyword‘,//关键字‘a‘:‘indentifier‘,//标识符‘=‘:‘assignment‘,//分配‘2‘:‘interger‘,//整数‘;‘:‘eos‘,结束语局*//... 查看详情

javascript必须了解的知识点总结。

整理的知识点不全面但是很实用。主要分三块:(1)JS代码预解析原理(包括三个段落);(2)函数相关(包括函数传参,带参数函数的调用方式,闭包);(3)面向对象(包括对象创建、原型链,数据类型的检测,继承)。&... 查看详情