JS高级心法——作用域链

2024-05-23 21:58
文章标签 js 高级 作用域 心法

本文主要是介绍JS高级心法——作用域链,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先我们来看两个js中的代码:   
<script  type="text/javascript">  var c=5;function t1(){	var	d=6function t2(){var e=7		 alert(c+d+e);		}t2();}t1(); 
</script>
  这个你很快会得出结论:18;

<script language="javascript" type="text/javascript">function t1(){	var d;function t2(){d=5;e=6;}t2();}t1();alert(e);  alert(window.d);
</script>
     

   思考下?……

你的答案是 6,undefined吗?如果不是请继续往下看吧,这其实就是作用域链的问题。

   我们知道js中用var声明一个变量 ,寻找变量首先在函数内寻找,找不到则再往外层寻找直到全局(window)区域。这就是第一个程序的依据
   window.xxx引用全局变量,找不到作为某个属性不存在,则返回undefined。

   好了再看一个:

<script  type="text/javascript">   var str1='global';function t1(){	alert(str1);alert(str2);var str2='local';	  }t1();	
</script>

    这个如果你在网上查好多关于作用域的都有这个例子来解释,但是看了他们洋洋洒洒写了好多结果自己越看越迷糊。

    历经千辛万苦终于得出了很实用的方法,免得看太多让人头晕的东西。

其实js代码在整体运行时分为:词法分析期运行期   

    词法分析分析3样东西:第一步:先分析参数
                        第二步:再分析变量声明
                        第三步:分析函数声明
   具体: 0:函数运行前瞬间生成活动对象Actve Object(AO)
          1:
             1.1函数声明的参数形成AO的属性值全是undefined
             1.2接收实参,形成AO相应的属性的值
          2:分析变量声明!
             如果AO上还没有属性,则添加AO属性,值是undefined
             如果已经有属性,则不做任何影响
          3.分析函数声明,如果函数属性已经存在,则被覆盖。

   依据整理分析下下面:

<script  type="text/javascript">   function t2(age){var age=99;alert(age); }t2(5);//运行结果是99
</script>
分析过程:

0:形成AO={}

1.分析形参age为undefined

2.分析var age 发现AO已经有age属性,不做任何影响

执行过程:AO.age=99;

alert(age)结果为99

明白了作用域链分析出结果我们才能更好的明白视频中讲解的例子,以后再也不用担心自己找不到“北”了!



这篇关于JS高级心法——作用域链的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/996528

相关文章

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

Java中的for循环高级用法

《Java中的for循环高级用法》本文系统解析Java中传统、增强型for循环、StreamAPI及并行流的实现原理与性能差异,并通过大量代码示例展示实际开发中的最佳实践,感兴趣的朋友一起看看吧... 目录前言一、基础篇:传统for循环1.1 标准语法结构1.2 典型应用场景二、进阶篇:增强型for循环2.

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

一文全面详解Python变量作用域

《一文全面详解Python变量作用域》变量作用域是Python中非常重要的概念,它决定了在哪里可以访问变量,下面我将用通俗易懂的方式,结合代码示例和图表,带你全面了解Python变量作用域,需要的朋友... 目录一、什么是变量作用域?二、python的四种作用域作用域查找顺序图示三、各作用域详解1. 局部作

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

mysql中的group by高级用法详解

《mysql中的groupby高级用法详解》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,本文给大家介绍mysql中的groupby... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使