JavaScript引擎在开始编译代码的时候,会对JavaScript代码进行一次预编译,生成一个执行环境,比如如下代码:

window.onload=function(){
function sub(a,b){
return a-b;
}
var result=sub(5,10);
}

就会生成如下图所示的一个类似嵌套的执行环境的逻辑结构视图,

说明:这些执行环境(也叫作用域)都会有一个变量对象,这些变量对象保存着该执行环境(作用域)中的所有变量与函数的名和值,虽然JavaScript代码还没有执行,但是你所书写的代码中的所有变量名和函数名已经提前保存在了这些变量对象中。当代码执行的时候,这些变量对象会和作用域链进行密切的配合,帮助JavaScript引擎寻找函数执行时所需要的变量和函数。如果内部的函数没有该变量,就向外边去找。

而这些环境变量的存储结构视图却不是嵌套的,而是用堆栈的形式:如图:

同样为了满足逻辑结构中提到的变量/函数的遍历寻找,JavaScript提出了作用域链的概念,这在下节会讲到。

介绍完JavaScript在预编译时的逻辑结构和存储结构,下面就说说JavaScript引擎在处理上述内容时实现的两个规则:

1.声明变量时用var和不用var

用var,JavaScript在预编译的时候会把这个变量放到该执行环境的变量对象中,不用var声明,就放到全局执行环境的变量对象中。

2.如果变量和函数的声明重名怎么办

这得分情况:

如果变量已经赋值,不管变量声明在前还是在后,函数的声明无效。

如果变量没赋值,不管函数声明在前还是在后,变量的声明无效。

这两条没有什么原理,是js原创者当时做的时候就是这么规定的。希望大家牢记。

通过上述的讲解,我想大家能够轻松的理解以下所谓的《你真的了解JavaScript吗?》系列问题的解题原理了。

1.

if (!("a" in window)) {
var a = 1;
}
alert(a);

2.

var a = 1,
b = function a(x) {
x && a(--x);
};
alert(a);

3.

function a(x) {
return x * 2;
}
var a;
alert(a);

图解JavaScript执行环境结构的更多相关文章

  1. javascript执行环境(执行期上下文)详解

    javascript执行环境(执行期上下文) 当js控制器(control)进入可执行代码时,控制器会进入一个执行环境,活动的多个执行环境构成执行环境栈,最上面的是正在运行的执行环境,当控制器进入一个 ...

  2. JavaScript 执行环境、作用域、内存管理及垃圾回收机制

    前言 JavaScript具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存. [原理]找出那些不再继续使用的变量,然后释放其占用的内存.为此,垃圾收集器会按照固定的时间间隔( ...

  3. 夯实基础上篇-图解 JavaScript 执行机制

    讲基础不易,本文通过 9 个 demo.18 张 图.2.4k 文字串讲声明提升.JavaScript 编译和执行.执行上下文.调用栈的基础知识.

  4. JavaScript执行环境

    执行环境(Execution Context,也称为"执行上下文")是JavaScript中最为重要的一个概念.执行环境定义了变量或函数有权访问的其它数据,决定了各自的行为.当Ja ...

  5. Javascript 执行环境及作用域

    执行环境是javascript中最为重要的一个概念. 执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为. 每个执行环境都有一个与之关联的变量对象(variable object),环境 ...

  6. 【原】javascript执行环境及作用域

    最近在重读<javascript高级程序设计3>,觉得应该写一些博客记录一下学习的一些知识,不然都忘光啦.今天要总结的是js执行环境和作用域. 首先来说一下执行环境 一.执行环境 书上概念 ...

  7. DOM笔记(八):JavaScript执行环境和垃圾收集

    一.执行环境 在有关于JavaScript对象或者this的指向问题时,脱离不了的另外一个概念就是执行环境,即上下文环境.执行环境在JavaScript是一个 很重要的概念,因为它定义了变量或函数有权 ...

  8. javascript 执行环境,变量对象,作用域链

    前言 这几天在看<javascript高级程序设计>,看到执行环境和作用域链的时候,就有些模糊了.书中还是讲的不够具体. 通过上网查资料,特来总结,以备回顾和修正. 要讲的依次为: EC( ...

  9. JavaScript 执行环境(执行上下文) 变量对象 作用域链 上下文 块级作用域 私有变量和特权方法

    总结自<高程三>第四章  理解Javascript_12_执行模型浅析   JS的执行环境与作用域  javascript高级程序第三版学习笔记[执行环境.作用域] 在javascript ...

随机推荐

  1. 6.html5分组元素

    何为分组元素,首先先看下面这个例子: <span>scolia<span>scolia</span></span> <span>scolia ...

  2. Effective C# 学习笔记(原则一:始终能的使用属性(property),而不是可直接访问的Data Member)

    原则一:始终能的使用属性(property),而不是可直接访问的Data Member    Always use properties instead of accessible data memb ...

  3. C 几种异常机制简单讲述

    引言 这是关于C中如何使用异常机制的讨论.顺带讲一讲C中魔法函数的setjmp内部机制.通过它实现高级的异常try...catch. 允许我先扯一段面试题. 对于计算机面试题. 算法题等.觉得还是有意 ...

  4. Eclipse常用快捷键使用

    Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率.Eclipse中有如下一些和编辑相关的快捷键.     1. [ALT+/]     此快捷键为用户编辑的好帮手 ...

  5. jqgrid 列显示图片

    <script> var img; //自定义图片的格式,可以根据rowdata自定义 function alarmFormatter(cellvalue, options, rowdat ...

  6. iOS学习之界面通信

    一.属性传值 在SecondViewController.h里 #import <UIKit/UIKit.h> @interface SecondViewController : UIVi ...

  7. Objective-C 内存管理原则

    内存管理方针 用于内存管理的基本模型采用引用计数的环境之中提供的组合方法中定义在NSObject协议和标准方法的命名约定.NSObject类也定义了一个方法:dealloc,当调用一个对象时自动回收, ...

  8. mif_maker2010.exe下载和使用说明

    mif_malker2010.exe下载地址:http://pan.baidu.com/s/1bCqAp4 使用说明:http://www.cnblogs.com/BitArt/archive/201 ...

  9. Java Day 15

    String 字符串对象一旦被初始化就不会被改变  字符串常量池  String s = "abc"; //字符串常量池 String s = new String("a ...

  10. WIN7笔记本利用命令AP热点

    第一步:以管理员身份运行命令提示符:开始”---搜索栏输入“cmd----右键以“管理员身份运行”自己随便命名,第二步:运行命令:netsh wlan set hostednetwork mode=a ...