`

作用域链

 
阅读更多

作用域链 《javascript DOM高级程序设计》 P35页

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<script type="text/javascript" src="ADS-start.js"></script>
<script type="text/javascript">
function initAnchors(){
	for(var i=1;i<=3;i++){
		var anchor = document.getElementById('anchor'+i);
		ADS.addEvent(anchor,'click',function(){
				alert('my id is anchor '+i);
			});
	}	
}

ADS.addEvent(window,'load',initAnchors);
</script>
</head>

<body>
<ul>
	<li><a href="" id="anchor1">anchor1</a></li>
	<li><a href="" id="anchor2">anchor2</a></li>
	<li><a href="" id="anchor3">anchor3</a></li>
</ul>

</body>
</html>

 点击后都会弹出''my id is anchor 4'

 

我们想要的结果是我们点击第几个出现的就是相关的数字,'my id is anchor 1',为什么会这样呢?因为不的值实际上是在单击事件发生时才从作用域链中取得的,当单击事件发生时,initAnchors()已经执行完毕,因此i的值等于4,所以每个alert都会显示相同的信息。具体来说,当click事件侦听器被调用并在它的内部作用域中查找i的值时,结果没有找到,因为i的值在作用click事件侦听器的匿名函数中没有定义。

     要得到正确的结果,需要把事件侦听器的注册转移到一个独立的函数中,并通过该函数的参数传递适当的值

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<script type="text/javascript" src="ADS-start.js"></script>
<script type="text/javascript">
function registerListener(anchor,i){
	ADS.addEvent(anchor,'click',function(){	
			
			alert('my id is anchor '+i);
		});	
}

function initAnchors(){
	for(var i=1;i<=3;i++){
		var anchor = document.getElementById('anchor'+i);
		
		registerListener(anchor,i);
	}	
}

ADS.addEvent(window,'load',initAnchors);
</script>
</head>

<body>
<ul>
	<li><a href="" id="anchor1">anchor1</a></li>
	<li><a href="" id="anchor2">anchor2</a></li>
	<li><a href="" id="anchor3">anchor3</a></li>
</ul>

</body>
</html>

  由于在作用域链中定义了额外的函数和变量,提示信息中保持了正确的值。因为click事件侦听器现在的外部使用域变成了

registerListener()函数,该函数在其每个实例(每次调用registerListener()函数都会生成该函数的一个副本,以维护正确的变量作用域)的内部作用域中都为i维护了一个唯一值。

 

分享到:
评论

相关推荐

    深入理解JavaScript作用域和作用域链

    JavaScript作用域是编程中至关重要的...在实际编程中,我们还会遇到闭包、块级作用域(ES6中的`let`和`const`)等更高级的概念,这些都是基于作用域链的扩展,理解它们对于成为精通JavaScript的开发者来说必不可少。

    JavaScript中作用域链的概念及用途讲解

    JavaScript中的作用域链是编程中一个至关重要的概念,它决定了变量和函数的可访问性以及在不同作用域内的查找顺序。在深入理解作用域链之前,我们首先要了解什么是执行环境和变量对象。 执行环境,简单来说,就是...

    js作用域链图解ppt

    JavaScript中的作用域链是理解变量查找和闭包的关键概念。作用域链主要涉及到函数执行上下文和全局执行上下文中的作用域。以下是对这个主题的详细解释: 首先,每个函数在创建时,都会有一个内部属性[[scope]],它...

    深入了解JavaScript,优化作用域链(2).pdf

    下面我们从多个方面来详细探讨作用域链的概念、作用域链的层级关系、变量访问的性能影响,以及如何通过优化作用域链来提升程序性能。 首先,作用域是编程中一个基本的概念,它决定了变量和函数的可访问范围。在...

    javascript 闭包、匿名函数、作用域链

    JavaScript中的闭包、匿名函数和作用域链是编程中至关重要的概念,它们是理解JavaScript运行机制的关键。在本文中,我们将深入探讨这三个概念,并通过实际示例来展示它们的运用。 首先,我们来讨论“闭包”。闭包是...

    JavaScript — 原型链与作用域链1

    JavaScript是一种广泛用于网页和网络应用的脚本语言,它的核心特性包括原型链和作用域链。这两个概念是理解JavaScript中对象继承和变量访问的关键。 **作用域链** 1. **作用域生成**:每次JavaScript代码执行时,...

    javascipt作用域、作用域链

    本PPT以一个小demo作为案例,进行透彻的分析作用域,以及作用域链产生的过程,帮助你深刻理解作用域。

    javascript作用域链(Scope Chain)初探.docx

    ### JavaScript作用域链(Scope Chain)初探 #### 一、引言 JavaScript的作用域链是一个重要的概念,尤其是在深入理解JavaScript执行机制时不可或缺的一部分。本文将通过对几个具体例子的分析来探讨JavaScript作用域...

    夯实基础中篇-图解作用域链和闭包.doc

    在JavaScript编程中,作用域链和闭包是两个至关重要的概念,它们对于理解代码执行机制以及函数内部如何访问和管理变量至关重要。让我们深入探讨这两个概念。 首先,**作用域链**是JavaScript中的一种机制,它定义了...

    作用域链(Scope Chain)

    我们已经知道一个执行上下文 的数据(变量、函数声明和函数的形参)作为属性存储在变量对象中。 同时我们也知道变量对象在每次进入上下文时创建,并填入初始值,值的更新出现在代码执行阶段。

    深入了解JavaScript,从作用域链开始(1).pdf

    这个活动对象与当前作用域链的顶部连接,形成了作用域链。作用域链允许函数访问其自身作用域内的变量,以及包含它的所有外部作用域的变量,直到全局作用域。 JavaScript引擎在解析代码时,会先进行预解析阶段,将...

    10-作用域链和闭包:代码中出现相同的变量,JavaScript引擎是如何选择的?_For_vip_user_0011

    "作用域链和闭包:代码中出现相同的变量,JavaScript引擎是如何选择的?" 标题“作用域链和闭包:代码中出现相同的变量,JavaScript引擎是如何选择的?”中,我们可以看到JavaScript引擎是如何选择相同的变量的。...

    JavaScript 作用域 和作用域链

    当尝试访问一个变量时,JavaScript引擎会首先在当前作用域中查找,如果找不到,就会沿着作用域链向上层作用域查找,直到找到变量或者到达全局作用域。如果在全局作用域仍找不到,那么就会引发错误。 以提供的代码为...

    理解JavaScript作用域和作用域链

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript。任何程序...

    图解javascript作用域链

    JavaScript的作用域链是理解JavaScript执行环境的关键概念,它决定了变量和函数的可访问性。在JavaScript中,每个函数都有自己的作用域,而这些作用域按照特定的顺序组织起来,形成了作用域链。这个链帮助解析器在...

    详解JavaScript作用域和作用域链

    虽然对于许多新手开发者来说,作用域的概念并不是很容易理解,本文我会尽我所能用最简单的方式来解释作用域和作用域链,希望大家有所收获! 作用域(Scope) 1. 什么是作用域 作用域是在运行时代码中的某些特定部分中...

    03_作用域链.html

    03_作用域链.html

Global site tag (gtag.js) - Google Analytics