一、javascript的解析顺序

  我们大家所理解的代码的执行顺序都是从上到下的,但是实际上确不是这样的。我们看一下下面的代码。

  

1 alert(a);
2 var a = 1;

  如果执行顺序是从上到下的,在上面弹出一个a,浏览器会认为从上到下执行的,那么当它alert(a)的时候,他就会发现没有这个东西,那么他就会报错,但是实际上他弹出来的结果是undefined。返回值是undefined说明a没有被定义也就是没有赋值。下面我来讲解一下javascript的解析顺序。

  1.ES5中有声明意义的关键字

    var   会存在变量提升

    function  也有声明变量的的作用。

  2.解析顺序

    1.找声明  var、function   声明:只是声明变量,而不包括赋值。

    2. 执行

    注意:以上两步 都遵循从上至下,执行的时候遇到等号,先看等号的右边。

    注意:当function声明的变量和var声明的变量重名时,function的变量权重会比var声明的要高。

  下面多来几个例子解析一下就清楚许多了,但是看例子之前要知道一下什么叫作用域。

二、作用域

  作用域就是:起作用的范围分为下面两种

  1.全局作用域

  2.函数作用域

    他们两个的区别看下面的例子仔细分析。

三、看几个例子解析一下执行顺序的步骤

 1. 第一个例子:

var x = 5;
a();
function a(){
alert(x);
var x = 10;
}
alert(x);

  解析过程

  1,.寻找声明   (看全局作用域)

    var x;

    function a(){}

  2.执行

    x = 5;

    a()  ------------->执行到这个函数的过程中在重新进行以上两步

            1,寻找声明 var x;  (函数作用域)

            2. 执行

              alert(x);  这个x在函数作用域中存在,并且还没有执行到赋值的那一步,那么弹出的东西就是undefined;

              x = 10;

    alert(x)    这里弹窗是全局变量  5;

  所以浏览器弹窗的内容是   undefined  5

 2. 第二个例子

 a()
function a(){
alert(x);
var x = 10;
}
alert(x);

  解析过程 按照上面的例子一样分析

  1. 寻找声明

   function a(){}

  2.执行

   a()------------------------->函数

            1.寻找声明

              var x;

            2.执行

              alert(x)    弹出未定义

              x = 10;

  alert(x);  这里的x会从全局中寻找x,但是发现并没有x,所 以浏览器会 报错     x is not  defined x没有被定义

  所以浏览器的弹出的内容是  undefined  报错

 

  我相信看了这两个例子的人都对这个解析过程都有了清除的了解,如果还是不太了解,建议重新看一次。

  下面介绍几个需要注意的地方, 直接上例子

 3. 第三个例子

  前面讲到了当function声明的变量和var声明的变量重名时,function的变量权重会比var声明的要高。来一个例子证明一下

  

alert(a)

function a() {
alert("函数")
} var a = 1;
alert(a)

  解析过程

  1.寻找声明

   function a(){}

   var a;

  2. 执行

    alert(a) 前面说到了function的声明比var声明的权重高,所有执行这个的时候他会弹出这个 函数块(函数体)

    a = 1;

    alert(a);     这里弹出的就是 1 了

  所以最后的结果就是 函数块 1;

 4.第四个例子

  子作用域可以向父级作用域找变量,直到全局作用域为止,反之不行。 如果子作用域有同样的变量,那么他就会使用自己的,不会去找爸爸要。

  

var a = 5;

function fn() {
alert(a)
} fn()

  解析过程

  1.寻找声明

    var a;

    function fn(){}

  2.执行

    a = 5;

    fn()--------------------------------------> 函数

                    1.找声明

                    2.执行

                     alert(a);  他这里没有a 所以去找爸爸要。  a = 5;   所以弹窗是  5

  所以最后结果为  弹窗5

  下面看一下爸爸会不会去找儿子要东西

function fn(){
var b = 5;
return b;
}
fn();
alert(b);

  1.寻找声明

    function fn(){}

  2. 执行

    fn()----------------------------------------> 函数

                      1.寻找声明

                        1.var b;

                      2.执行

                        return b;

  alert(b);   //我们看一下返回值是多少   b is not defined   他说b没有被定义,说明父作用域不可以向自作用域去寻找变量。

 5. 第五个例子

  当一个变量无中生有时,不管从哪个作用域出来的,统统归到window下,下面看两个例子

  

  fn();
alert(a);
var a = 0;
alert(a);
function fn(){
var a = 1;
}

这一个例子应该可以自己分析了  最后的结果是  undefined   0

我们再来看一下下面这个你会很吃惊

  fn()
alert(a)
var a = 0;
alert(a);
function fn(){
a = 1;
}

  明明都一样,我吃惊什么 返回值不是还是 undefined 和 0 吗

  但是你有没有发现倒数第二行 上面的声明了 下面的没有声明,来解析一波

  1.寻找变量

    var a;

    function fn(){}

  2.fn()---------------------------->函数

          a = 1;  这个时候就说到了那一点,无中生有的变量,统统归到window下面

  所以下面的执行过程

  alert(a)    这里的弹窗就是  1 了

   a = 0;

 alert(a)   弹出 0

  所以最后的结果是   1       0

四、严格模式

  严格模式下的代码执行时,非常严格

  变量不允许无中生有

  意义:规范代码开发的流畅,逻辑

  

"use strict"
a = 1;
alert(a);

当我们写后面两句代码的时候不会报错和出现问题,但是当我们加上第一句代码的时候,我们在这样写的时候就会报错了。所以我们还是按照规范的标准来,提高自己的能力

五、可能好多人做了上面的例子感觉不太过瘾,下面我再给出几个例子,可以自己去分析分析,我会在最后面给出答案。

1. 第一个例子    //  10 报错

var a = 10;
alert(a);
a()
function a(){
alert(20);
}

2.第二个例子   undefined 1 0

var a = 0;
function fn(){
alert(a);
var a = 1;
alert(a);
}
fn();
alert(a);

3.第三个例子 当同样的声明同样的名字重复时,后面写的会覆盖前面写的  //2  1  1  3

 a()
var a = function(){
alert(1)
}
a();
function a(){
alert(2);
}
a();
var a = function(){
alert(3);
}
a()

如果你看到我的文章可以收获一些知识,那么我会非常高兴的。

 

js的解析顺序 作用域 严格模式的更多相关文章

  1. js---07 js预解析,作用域---闭包

    js解析器首先不会逐行读代码,这是第二部了. 首先 根据var找到变量,根据function找函数,找到变量var a = 1,js解析器只会读取等号前面的var a,并把a设置值未定义,并不会读取等 ...

  2. js解析顺序了解一下??

    我们在学习一种新事物的时候,总是知其然,而不知其所然.有些人会探究到底,有一些人会得过且过. 好了,开场白结束,直接进入正题. js不像C语言那样只要编译一次之后成.exe文件之后就不用在编译可以直接 ...

  3. [妙味JS基础]第六课:作用域、JS预解析机制

    知识点总结 浏览器的解析方法 script 全局变量,全局函数 自上而下 函数 由里到外 "JS的解析器": 1)“找一些东西”:var function 参数 var a=未定义 ...

  4. [js]js代码执行顺序/全局&私有变量/作用域链/闭包

    js代码执行顺序/全局&私有变量/作用域链 <script> /* 浏览器提供全局作用域(js执行环境)(栈内存) --> 1,预解释(仅带var的可以): 声明+定义 1. ...

  5. 请教前辈:关于JS的一个奇怪的错误,不知是解析顺序造成的,还是什么原因。。

    各位前辈好,如题,不知道是HTML解析顺序造成的,还是JS预编译的结果(见注释). 烦请各位前辈进行指导. <!DOCTYPE html> <html> <head> ...

  6. JavaScript解析顺序和变量作用域

    JavaScript基础之变量作用域. 一. 1.全局变量:全局变量的意思就是,在代码的不论什么地方都能够訪问到.注意:未定义 直接赋值的变量拥有全局属性. 2.局部变量:局部变量的意思就是,变量的作 ...

  7. javascript的解析顺序

    一.javascript的解析顺序 我们大家所理解的代码的执行顺序都是从上到下的,但是实际上确不是这样的.我们看一下下面的代码. 1 alert(a);2 var a = 1;如果执行顺序是从上到下的 ...

  8. JS基础篇之作用域、执行上下文、this、闭包

    前言:JS 的作用域.执行上下文.this.闭包是老生常谈的话题,也是新手比较懵懂的知识点.当然即便你作为老手,也未必真的能理解透彻这些概念. 一.作用域和执行上下文 作用域: js中的作用域是词法作 ...

  9. JS中变量、作用域的本质,定义及使用方法

    全局作用域和局部作用域 全局作用域 局部作用域:函数作用域 全局作用域在全局和局部都可以访问到,局部作用域只能在局部被访问到 var name="cyy"; function fn ...

随机推荐

  1. 201521123080《Java程序设计》第3周学习总结

    1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识组织起来.请使用纸笔或者下面的工具画出本周学习到的知识点.截图或者拍照上传. 2. 书面作 ...

  2. 201521123030《Java程序设计》第1周学习总结

    #1. 本章学习总结 你对于本章知识的学习总结 了解了java的发展简介 认识了jvm/jre/jdk的联系,学习安装jdk java好麻烦的说... 1.为什么java程序可以跨平台运行?执行jav ...

  3. vbs文件共享变量与函数的方法

    参考资料: vbs能否像其他编程语言一样,把写好的代码打包成类库以供调用呢?经过搜索和实验,发现vbs文件之间可以互相调用并共享变量,这样我们就不用再反复地编写轮子了. 以下是一个调用实例: ==== ...

  4. hdu 6197 array array array

    array array array Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  5. 《MySQL必知必会》[01] 基本查询

    <MySQL必知必会>(点击查看详情) 1.写在前面的话 这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐.之前自己学习的时候是啃的清华大学出版社的计算机系列教材< ...

  6. 【译】The Accidental DBA:SQL Server Backup

    最近重新翻看The Accidental DBA,将SQL Server Backup部分稍作整理,方便以后查阅.此篇是Part 1Part 2:The Accidental DBA:Troubles ...

  7. 关于Linux的虚拟内存管理

    在linux中可以通过free指令查看当前内存,在后面加-m参数能让数字单位显示为MB. 一般机器,有一个实际内存和一个虚拟内存. swap就是虚拟内存,这个虚拟内存可以是文件,也可以是磁盘分区.通常 ...

  8. pig报错

    pig failed to read data from....... 错误可能1:load data的目录不在,或者引用出错,load data '/in/train'这里的红色/应该去掉,因为默认 ...

  9. [LeetCode] 344 Reverse String && 541 Reverse String II

    原题地址: 344 Reverse String: https://leetcode.com/problems/reverse-string/description/ 541 Reverse Stri ...

  10. E2195 cannot evaluate function call

    E2195 cannot evaluate function call :e2195无法评估函数的调用     :问题的根源在于,对组件创建了不合理的触发事件导致的.    :OK