一、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. 201521123122 《java程序设计》 第六周实验总结

    201521123122 <java程序设计>第六周实验总结 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想 ...

  2. 201521123017 《Java程序设计》第5周学习总结

    1. 本周学习总结 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 1.2 ...

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

    1. 本章学习总结 在本章的学习中,我和当初学习C语言一样由"Hello world"入手,初步了解了: 1. *NotePad++*的文件创建和编写*Hello world.ja ...

  4. 201521123035《Java程序设计》第十四周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...

  5. Java:final、static关键字 详解+两者结合使用

    一  final关键字 1) 关于final的重要知识点 final关键字可以用于成员变量.本地变量.方法以及类. final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误. ...

  6. 纳税服务系统【抽取BaseService、条件查询】

    抽取BaseService 到目前为止,我们已经写了三个模块的开发了.我们已经抽取过了BaseAction.BaseDao,我们这次来看看我们的Service接口. UserService /** * ...

  7. Spring02-AOP

    1,动态代理,指的是通过一个代理对象创建需要的业务对象,然后在这个代理对象中统一进行各种操作. 步骤: 1)写一个类实现InvocationHandler接口: 2)创建要代理的对象 2,创建一个简单 ...

  8. Android 之JDBC

    JDBC(Java DataBase Connectivity)是使用 Java 存取数据库系统的标准解决方案,它将不同数据库间各自差异API与标准 SQL语句分开看待,实现数据库无关的 Java操作 ...

  9. unity3D写一个hello world

    unity3D写一个hello world 打开unity并且在assets建立一个新的文件,新的文件命名为hello world.unity.接着创建一个新的C#Sript脚本文件,命名为hello ...

  10. 利用原生js制做数据管理平台,适合初学者学习

    摘要:数据管理平台在当今社会中运用十分广泛,我们在应用过程中,要对数据进行存储,管理,以及删除查询等操作,而我们在实际设计的时候,大牛们大多用到的是JQuery,而小白对jq理解也较困难,为了让大家回 ...