作用域和闭包(一)

作用域和闭包(一)

一、作用域是什么?

  1、概念:设计好一套规则来存储变量,并且之后可以方便找到这些变量。(并且之后对这个值可以进行访问和修改。)

  2、传统编译语言流程:程序中的源代码在执行之前,会经历以下三个步骤,统称为“编译”;

   (1)分词/词法分析。(这个·过程会将由字符组成的字符串分解成(对编程语言来说)有意义的代码块,这些代码块被称为词法单元。)

      例:var a = 2; //被分解成 var、a、=、2、;这些词法单元。(空格是否被当作词法单元,却决于它在语言中的意义);

   (2)解析/语法分析。

   (3)代码生成。

      概念:将AST转换为可执行代码的过程称为代码生成。(就是将var a = 2;的AST转化为一组机器指令,用来创建一个a的变量并将一个值·存储在a中。)

      任何JavaScript代码在执行之前都要进行编译

  3、理解作用域

    (1)对var  a = 2;进行处理的三大成员

      引   擎:从头到尾负责整个JavaScript程序的编译和执行过程。

      编译器:负责语法分析及代码生成。

      作用域:负责收集并维护由所有生命的标识符(变量)组成的一系列查询,并实施一套非常严厉的规则,确定当前执行的代码对这些标识符的访问权限。

    (2)编译处理过程。

      首先,遇到 var a ,编译器会询问作用域中是否已经有一个该名称的变量存在于同一个作用域的集合中。如果是,编译器会忽略该声明,继续进行编译;否则,它会要求作用域在当前

         域的集合中生命一个变量,并命名为a;

      其次,编译器会为引擎生成运行时所需的代码,这些代码备用来处理a = 2;这个赋值操作。引擎运行时会首先访问作用域,当前作用域集合中是否存在一个叫做a的变量。如果是,引

         擎就会使用这个变量;如果不是,引擎会继续查找该变量。(找不到,会抛出一个异常。)

    (3)引擎对a进行的左侧查询(LSH,赋值操作的目标),右侧查询(RHS,赋值操作的源头);即变量出现在赋值操作的左侧时,进行LSH查询,出现在右侧时进行RHS查询。

       RHS理解为“得到某某的值”,LHS试图找到变量的容器本身,并对其赋值。

       RHS   例:console.log(a);   这里用了a,却没赋值,只是查找a的值,并传给console.log(..)

       LHS   例:a = 2;  并不关心当前的值,只是想为=2这个赋值操作找到个目标。

        例: function foo(a){

            console.log(a);

          }

          foo(2);

          其中既有左侧查询,又有右侧查询。有个隐式转换,a = 2;

  4、作用域嵌套

       引擎从当前的执行作用于开始查找变量,如果找不到,就向上一级继续查找。当到全局作用域时,不管有没有找到,都会停止。(当RHS查询在所有嵌套的作用域中遍寻不到所需的

       变量,引擎就会抛出一个ReferenceError异常。)如果在“不在严格模式下,左侧查询,查不到该变量,就会创建一个变量。”(严格模式禁止自动或隐式的创建全局变量);严格模式

       下,也会抛出ReferenceError异常;如果引用null或者undefined类型中的值,会抛出TypeError错误。

二、词法作用域

    未完待续。。。。

  

原文地址:https://www.cnblogs.com/yaosusu/p/11407737.html

时间: 2024-10-03 23:30:24

作用域和闭包(一)的相关文章

JavaScript函数,作用域以及闭包

JavaScript函数,作用域以及闭包 1. 函数 (1). 函数定义:函数使用function关键字定义,它可以用在函数定义表达式或者函数声明定义. a. 函数的两种定义方式: * function functionName() {} * var functionName = function(){} b. 两种函数定义不同之处 1). 声明提前问题 函数声明语句   :声明与函数体一起提前 函数定义表达式 :声明提前,但是函数体不会提前 请看下面图示:绿色线上面实在js初始加载的时候,查看

JavaScript【5】高级特性(作用域、闭包、对象)

笔记来自<Node.js开发指南>BYVoid编著 1.作用域 if (true) { var somevar = 'value'; } console.log(somevar); JavaScript的作用域完全是由函数决定的,if.for语句中的花括号不是独立的作用域. 1.1.函数作用域 作用域是通过函数来定义的,在一个函数中定义的变量只对这个函数内部可见,我们称为函数作用域.在函数中引用一个变量时,JavaScript会先搜索当前函数作用域,或者称为"局部作用域",

JS中的作用域和闭包

作用域:在编程语言中,作用域控制着变量与参数的可见性及生命周期.JS确实有函数作用域,那意味着定义在函数中的参数和变量在函数外部是不可见的,而且在一个函数中的任何位置定义的变量在该函数中的任何地方都是可见的. var a = 1; var fs = function (){ var b = 2; var c = 4 var fun = function (){ var c = 3; alert(a) //输出1 alert(b) //输出2 alert(c) //输出3 } fun(); } f

函数放到onload里面,在html里面执行函数会报错-----作用域和闭包相关问题

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>修改显示隐藏</title> <meta name="description" content

你不知道的JavaScript(作用域和闭包)

作用域和闭包 ?作用域 引擎:从头到尾负责整个JavaScript的编译及执行过程. 编译器:负责语法分析及代码生成等. 作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限. 作用域是一套规则,用于确定在何处以及如何查找变量(标识符). 如果查找的目的是对变量进行赋值,那么就会使用LHS查询: 如果目的是获取变量的值,就会使用RHS查询. ?词法作用域 无论函数在哪里被调用,也无论它如何被调用,它的词法作用域都只由

js最基础知识回顾3(字符串拼接,数据类型,变量类型,变量作用域和闭包,运算符,流程控制,)

一.javaScript组成     1.ECMAScript:解释器.翻译 ---------------------------------------------------------几乎没有兼容性问题     2.DOM:Document Object Model --------操作HTML的能力----document--------有一些兼容性问题     3.BOM:Browser Object Model -------------浏览器---------------wind

作用域与闭包详解

关于作用域与闭包的解析,供大家解读. 1 //关于作用域 2 //官方定义:作用域以函数为临界点,不同函数都拥有相对独立的作用域 3 //简单理解:一个方法一个{}就是一个作用域 4 //例子: 5 function test(){ 6 a = 1; 7 var b = 2; 8 } 9 alert("a="+a);//返回 1 10 alert("b="+b);//返回undefined 11 //总结:变量分为全局变量和局部变量,局部变量只在本作用域内可访问;现

js面试题知识点全解(一作用域和闭包)

问题: 1.说一下对变量提升的理解 2.说明this几种不同的使用场景 3.如何理解作用域 4.实际开发中闭包的应用 知识点: js没有块级作用域只有函数和全局作用域,如下代码: if(true){ var name='killua' //把name定义在块里和放在外面是一样的,等同于在外面声明一个变量name,在块内给name赋值 }//同等于下面的代码 //建议用下面方式写 var name if(true){ name='killua' } console.log(name) //打印出来

【 js 基础 】作用域和闭包

一.编译过程 常见编译性语言,在程序代码执行之前会经历三个步骤,称为编译. 步骤一:分词或者词法分析 将由字符组成的字符串分解成有意义的代码块,这些代码块被称为词法单元. 例子: var a = 2; 这一句通常被分解成为下面这些词法单元:var .a . = .2.; . 步骤二:解析或者语法分析 将词法单元流(数组)转换成一个由元素逐级嵌套所组成的代表了程序语法结构的树.这个树被称为"抽象语法树"(Abstract Syntax Tree, AST) 例子: var .a . =

JavaScript this 局部变量全局变量 作用域 作用域链 闭包

从阮老师博客的一道测试题说起: 代码段一: var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()()); 代码段二: var name = "The Window"; var object