javaScript教程50: 变量查找规则与词法作用域

作用域:

1 在es5.0中只有函数可以构成一个作用域 2 全局作用域: 整个js代码执行的环境 3 局部作用域: 函数可以构成一个局部作用域 4 全局变量: 在全局作用域中申明的变量 5 局部变量: 在函数构成的局部作用域中申明的变量

var a = 1;
  function fn(){
   var a = 2;
    function fnA(){
     a = 3;
     console.log(a);  //3
    }
   fnA();
   console.log(a); // 3
  }
    fn();
  console.log(a);// 1

词法作用域(静态作用域):

  1. 外部作用域不能访问内容作用域的变量
  2. 查找变量时,顺着作用域链查找
  3. 在代码执行之前,先执行预解析规则
  4. 如果要调用函数,函数内部也要先进行预解析
  5. 如果要给变量赋值之前,一定要先找到变量

变量的查找规则

1 先在自己的作用域里面找,如果没有就顺着作用域链往上找,找到则返回,找不到则一直找到全局为止 2 如果要直接赋值的话,找到全局也没有,那么浏览器会帮我们自动创建一个出来 3 如果只是访问的话,找到全局都没有就报错 xxx is not defined

原文地址:https://www.cnblogs.com/autoXingJY/p/9053922.html

时间: 2024-11-04 11:10:49

javaScript教程50: 变量查找规则与词法作用域的相关文章

《你不知道的JavaScript》读书笔记(二)词法作用域

JavaScript 采用的是 词法作用域 的工作模型. 定义 词法化:大部分标准语言编译器的第一个工作阶段叫词法化(单词化),这个过程会对源代码中的字符进行检查,如果是有状态的解析过程,还会赋予单词意义. 词法作用域:定义在 词法阶段 的作用域. 词法作用域由谁决定:由你在写代码时将 变量 和 块作用域 写在哪里来决定.因此大部分情况下,词法分析器处理代码时会保持作用于不变. [例] function foo(a){ var b = a * 2; function bar(c){ consol

javascript教程50:认识instanceof 与 原型链

1 instanceof: 1.1 普通使用下: 判断一个对象是否是某个构造函数的实例: 语法 : 对象 instanceof 函数 是则返回true,不是则返回false. console.log(obj instanceof Object); 1.2 高级用法: 判断一个函数的原型对象,是否在实例对象的原型链上 1.3 案例如下: var arr = []; console.log(arr instanceof Array); //true console.log(arr instanceo

JavaScript词法作用域(你不知道的JavaScript)

JavaScript并不是传统的块级作用域,而是函数作用域! 一.作用域 1. JavaScript引擎在代码执行前会对其进行编译,在这个过程中,像var a = 2 这样的声明会被分解成两个独立的步骤: 第一步(编译阶段):var a 在其作用域中声明新变量.这会在最开始的阶段,也就是代码执行前进行. 第二步(运行阶段):a = 2 会查询变量a(LHS查询)并对其进行赋值. 2. LHS & RHS(当前作用域->上级作用域->...->全局作用域) LHS(左侧):试图找到

JavaScript 对象的值查找

Javascript对象的值查找规则: 查找顺序 该对象本身 该对象构造函数的prototype 该对象构造函数的prototype 的构造函数的prototype,以这样的方式沿原型链条逐级查找, 直至Object的prototype 整个查找链条中都没有找到则返回 undefine 查找过程中一旦找到则返回找到的值 1 Object.prototype.foo = 'bar'; 2 3 function People() {} 4 People.prototype.kind = 'Peopl

javascript数据类型(六)--- 函数对象之作用域和作用域链

一.作用域 1.1 理解 * 就是一块"地盘", 一个代码段所在的区域 * 它是静态的(相对于上下文对象), 在编写代码时就确定了 1.2  分类 * 全局作用域 * 函数作用域 * 没有块作用域(ES6有了) 1.3 作用 * 隔离变量,不同作用域下同名变量不会有冲突 1.4 作用域与执行上下文的区别 区别1:创建的时间不同 全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定了.而不是在函数调用时 全局执行上下文环境是在全局作用域确定之后, js代码马上执行之

JavaScript 变量命名规则

著名的变量命名规则Camel 标记法首字母是小写的,接下来的字母都以大写字符开头.例如: var testValue = 0, secondValue = "hi";Pascal 标记法 首字母是大写的,接下来的字母都以大写字符开头.例如: var TestValue = 0, SecondValue = "hi";匈牙利类型标记法 在以 Pascal 标记法命名的变量前附加一个小写字母(或小写字母序列),说明该变量的类型.例如,i 表示整数,s 表示字符串,如下

你不知道的Javascript(上卷)读书笔记之二 ---- 词法作用域

在前一篇文章中,我们把作用域定义为"管理.维护变量的一套规则",接下来是时候来深入讨论一下Js的作用域问题了,首先我们要知道作用域一般有两种主要的工作类型,一种是词法作用域,一种是动态作用域, Javascript采用的是词法作用域, 关于动态作用域的有兴趣的可以自行Google. 1.词法阶段 首先我们要理解"词法阶段"这个词语,我们已经了解到Js存在一个编译阶段,编译阶段的第一步就是分词/词法分析,我们可以简称为"词法阶段" 简单来说,词法作

深入理解javascript作用域系列第二篇——词法作用域和动态作用域

× 目录 [1]词法 [2]动态 前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极易出错.这实际上是由两种作用域工作模型导致的,作用域分为词法作用域和动态作用域,分清这两种作用域模型就能够对变量查找过程有清晰的认识.本文是深入理解javascript作用域系列第二篇——词法作用域和动态作用域 词法作用域 第一篇介绍过,编译器的第一个工作阶段叫作分词,就是把由字符组成的字符串分解成

javascript系列之变量对象

原文:javascript系列之变量对象 引言 一般在编程的时候,我们会定义函数和变量来成功的构造我们的系统.但是解析器该如何找到这些数据(函数,变量)呢?当我们引用需要的对象时,又发生了什么了? 很多ECMAScript编程人员都知道变量和所处的执行上下文环境是密切相关的: 1 var a=10;//全局上下文环境下的变量 2 (function(){ 3 var b=20;//函数上下文环境下的局部变量 4 })(); 5 alert(a);//10 6 alert(b);//"b"