浅谈js的解析顺序 作用域 严格模式


Posted in Javascript onOctober 23, 2017

一、javascript的解析顺序

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

alert(a);
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的解析顺序 作用域 严格模式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
在VS2008中使用jQuery智能感应的方法
Dec 30 Javascript
CodeMirror2 IE7/IE8 下面未知运行时错误的解决方法
Mar 29 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
Sep 25 Javascript
js简单实现Select互换数据的方法
Aug 17 Javascript
jQuery插件Validate实现自定义表单验证
Jan 18 Javascript
JavaScript正则表达式的分组匹配详解
Feb 13 Javascript
AngularJS入门教程之ng-class 指令用法
Aug 01 Javascript
jQuery轮播图效果精简版完整示例
Sep 04 Javascript
原生js实现放大镜效果
Jan 11 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
Mar 21 Javascript
JS+canvas实现的五子棋游戏【人机大战版】
Jul 19 Javascript
Ionic3实现图片瀑布流布局
Aug 09 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
Oct 23 #Javascript
React操作真实DOM实现动态吸底部的示例
Oct 23 #Javascript
利用pm2部署多个node.js项目的配置教程
Oct 22 #Javascript
vue.js中父组件调用子组件的内部方法示例
Oct 22 #Javascript
vue 1.x 交互实现仿百度下拉列表示例
Oct 21 #Javascript
JS返回顶部实例代码
Aug 09 #Javascript
VUE2实现事件驱动弹窗示例
Oct 21 #Javascript
You might like
用PHP来写记数器(详细介绍)
2006/10/09 PHP
php去掉字符串的最后一个字符附substr()的用法
2011/03/23 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
详解PHP中mb_strpos的使用
2018/02/04 PHP
PHP attributes()函数讲解
2019/02/03 PHP
ASP SQL防注入的方法
2008/12/25 Javascript
Jquery EasyUI的添加,修改,删除,查询等基本操作介绍
2013/10/11 Javascript
node.js中的http.response.getHeader方法使用说明
2014/12/14 Javascript
不依赖Flash和任何JS库实现文本复制与剪切附源码下载
2015/10/09 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
深入浅析JavaScript中的scrollTop
2016/07/11 Javascript
JavaScript面试题(指针、帽子和女朋友)
2016/11/23 Javascript
Vue.js实战之使用Vuex + axios发送请求详解
2017/04/04 Javascript
详解vue.js2.0父组件点击触发子组件方法
2017/05/10 Javascript
React中jquery引用的实现方法
2017/09/12 jQuery
一个简易时钟效果js实现代码
2020/03/25 Javascript
Vue通过URL传参如何控制全局console.log的开关详解
2017/12/07 Javascript
vue如何通过id从列表页跳转到对应的详情页
2018/05/01 Javascript
JavaScript类的继承方法小结【组合继承分析】
2018/07/11 Javascript
对angular 监控数据模型变化的事件方法$watch详解
2018/10/09 Javascript
VueX模块的具体使用(小白教程)
2020/06/05 Javascript
JavaScript DOM常用操作代码汇总
2020/07/03 Javascript
JavaScript如何实现监听键盘输入和鼠标监点击
2020/07/20 Javascript
[01:06:39]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第三局
2016/03/02 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
Python绘制七段数码管实例代码
2017/12/20 Python
python 每天如何定时启动爬虫任务(实现方法分享)
2018/05/21 Python
PyQt QListWidget修改列表项item的行高方法
2019/06/20 Python
Python实现新型冠状病毒传播模型及预测代码实例
2020/02/05 Python
Django缓存Cache使用详解
2020/11/30 Python
CSS3 绘制BMW logo实的现代码
2013/04/25 HTML / CSS
商家认证委托书格式
2014/10/16 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书
python ansible自动化运维工具执行流程
2021/06/24 Python
CSS实现五种常用的2D转换
2021/12/06 HTML / CSS
Win10防火墙白名单怎么设置?Win10添加防火墙白名单方法
2022/04/06 数码科技