`

js 中的作用域

    博客分类:
  • js
 
阅读更多

你是否被js 中的作用域搞的头晕脑胀,今天我们系统的梳理一下,首先看两个例子

 

function show(){
		var arr = new Array();
		for(var i=0;i<5;i++){
			arr[i] = function(){
				return i;
			}
		}
		return arr;
	}
	var a = show();
	var num = a[2]();
	document.write(num);

 输出num 的值是几 ,你的答案是 2?

 

 

 恭喜你答错了!答案应该是5。

 我又修改了一下,看下面这段程序,输出num的值是几?

 

function show1(){
		var arr = new Array();
		for(var i=0;i<5;i++){
			arr[i] = (function(num){
				
				return function(){
					return num;
				}
			})(i);
		}
		return arr;
	}
	var a1 = show1();
	document.write(a1[2]());

 

 

    你的答案是几,是2?恭喜你猜对了,如果这两段程序,你都说出了正确答案,剩下的内容就不用看了!

 

   首先我们看第一个问题,JS 中的块级作用域,函数级作用域,全局作用域

   

function show(){
		for(var i=0;i<5;i++){
		}
		document.write(i);
	}
show();

 

 

          输出i的值是几,熟悉java 的童鞋可能会说,这个会报错。但是这里会输出5

 为什么呢?

      在js 中没有块级作用的概念,只有函数级作用域和全局作用域的概念。在这里定义的i 在整个show 函数内都有效。for 循环执行完 i 的值就变成了5.

      在看另一个例子

       

 

var color = "red";
	function show(){
		document.write(color);
		var color = "blue";
	}
show();

 

 输出color 是 red,blue ,还是别的什么?red,恭喜你又猜错了!

这个地方是undefined!

为什么?在这个地方涉及到两个作用域,一个是全局作用域,一个是函数(show)作用域。在js 中定义的每个方法,js 引擎都会帮我们封装一个叫变量对象的东西,这个对象默认包含argumengs 这样的一个对象,在一个就是包含你在函数里定义的变量。在这里也就是你在show 方法里定义的 var color = 'blue' 。所以我们show 方法的这个变量对象包括两个变量,一个是arguments ,一个是color ,它的值是blue。

在show 方法里document.write(color);访问color 时有两个变量可以选择,一个是全局作用的color 它的值是red ,另外一个就是show 方法里的color 它的值是blue。根据js 作用域链访问就近原则,这里访问的是show 方法作用域的color ,那应该输出blue 才对啊,可是代码从上往下执行,当你document.write(color)时,color还没赋值呢,因为赋值语句在下面,所以这个地方输出的是undifined !如果你把函数里的var color = "blue"; 给注释掉,document.write(color);输出的就是red了。当访问color 时,先看一下函数作用域内有没有定义的color ,如果有就访问函数作用域的,如果没有就访问全局作用域的。

 

        有了上面的准备,我们在回过头来说一下开头的两个例子,第一个例子中的show 方法定义了 两个变量arr 和 i ,加上arguments  ,也就是说show 方法里的这个变量对象有3个变量。

       

       先看 arr 这个数组,数组中存放了5个函数对象,这5个函数对象访问的是show 方法的变量对象的 i 的值。

       一般情况下,当函数调用完,函数的变量对象自动销毁,但是对于当前的例子,show方法的变量对象不能释放,因为在调用完函数后,var a = show(); a这个变量持有arr 这个数组。而arr 里面的函数持有show 方法的变量对象。而show 方法只有一个变量对象,也只有一个i变量,所以a 这个数组里面的函数访问的都是该变量i。等到循环结束后,i 的值为5,所以数组里的函数的返回值都是5。

 

       而在开头的第二个例子中,

arr[i] = (function(num){
				
				return function(){
					return num;
				}
			})(i);

 

     我们通过函数的调用,进行值传递,将i 的值传给了变量 num ,等到show1 方法调用完,我们不在持有show1 方法变量对象的i 这个变量。所以得出答案是2。

     你是否对js 中的作用域有了更深的了解。

 

 

 

       

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    javascript变量作用域

    JavaScript 首先在当前作用域中查找变量,如果没有定义,则会继续查找上一层作用域,直到找到全局对象。在上面的代码中,我们定义了一个全局变量 rain,并在 rainman 函数中调用 inner 函数, inner 函数中没有定义 ...

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

    接着查找`fruit`,不在当前作用域,于是继续在全局作用域中找到`fruit`并使用。 而在全局环境中,当尝试访问`fruit`和`color`时,由于全局作用域的变量对象只包含`fruit`,所以`color`会导致一个`undefined`的错误...

    js变量作用域

    例如,如果在一个脚本文件或全局作用域中声明了一个变量,没有使用`var`、`let`或`const`关键词,则该变量会成为`window`对象的一个属性。这种变量在整个程序中都可以被访问到。 **示例代码**: ```javascript var ...

    JS中作用域以及变量范围分析

    变量作用域 js作为一门脚本语言,他与c,java这些语言是不相同的。 全局变量 在js中声明全局变量,有下面几种方式: 1.在函数外通过var来声明。 var test =hello; console.log(test); function a(){ test=xx; ...

    javascript执行环境,作用域理解

    在 JavaScript 中,执行环境和作用域是两个非常重要和基本的概念,理解了这两个概念对于 JavaScript 中很多脚本的运行结果就能明白其中的道理了。执行环境是一个概念,一种机制,用来完成 JavaScript 运行时在作用域...

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

    JavaScript作用域是编程中至关重要的概念,它规定了变量和函数的可见性及生命周期。JavaScript主要有两种作用域:全局作用域和局部作用域。 全局作用域是指在代码的任何位置都可以访问的变量或函数,这通常包括在最...

    函数的全局和局部作用域和变量-作用域.html

    // 全局变量: 在script之间或者一个独立的js文件中,在全局作用域中定义的变量 全局变量。在任何位置都可以访问 // 全局作用域:在script之间或者一个独立的js文件 script之间或者一个独立的js文件里的内容区域...

    深化理解javascript作用域其次篇之词法作用域和动态作用域_.docx

    深化理解javascript作用域其次篇之词法作用域和动态作用域_ 深化理解javascript作用域其次篇之词法作用域和动态作用域,是javascript中非常重要的一部分。理解词法作用域和动态作用域对javascript的编程至关重要。...

    JS的作用域与闭包

    闭包是JavaScript中一个高级概念,它允许一个函数记住并访问它外部作用域中的变量,即使该函数在其外部作用域之外执行也是如此。 ##### 1. 闭包的定义 闭包是由函数和与其相关的引用环境组合而成的实体,这个环境...

    JavaScript作用域原理

    首先,全局作用域是最外层的作用域,任何在这个作用域中声明的变量在整个脚本中都是可访问的。如果在函数外部声明一个变量,那么这个变量就是全局变量。全局变量在整个程序的生命周期中都存在,直到页面关闭才会消失...

    js中作用域的实例解析

    总结来说,JavaScript作用域的解析需要我们关注预解析阶段变量和函数声明的提升,以及作用域链的使用,特别要理解全局作用域和函数作用域的工作原理。通过以上的实例解析,我们可以更深入地理解JavaScript作用域的...

    深入理解变量作用域

    - 如果在当前作用域找不到变量,则继续在上一层作用域中查找,依此类推,直到到达全局作用域。 - 这个查找过程确保了变量的正确访问顺序,并避免了命名冲突。 2. **示例解析** ```javascript var scope = ...

    深入浅析JavaScript中的作用域和上下文

    JavaScript中,作用域和上下文是理解代码执行逻辑的关键概念。作用域指的是变量和函数的可见性和生命周期,而上下文则关乎`this`关键字的值,它指示了当前代码执行的环境。 **作用域(Scope)** 1. **全局作用域**...

    你不懂JS:作用域与闭.pdf

    《你不懂JS:作用域与闭包》这本书深入讲解了JavaScript中两个核心概念:作用域和闭包。作用域是JavaScript变量和函数定义的可见范围,它决定了代码中哪些部分可以访问特定变量。理解作用域对于编写可维护和高效的...

    05-JavaScript作用域.pdf

    JavaScript作用域是指在JavaScript代码中,变量、常量、对象和函数能够访问的范围。在编程中,变量和函数的使用都受到作用域的限制,决定了它们能够在哪些代码块中被引用。作用域有助于防止变量命名冲突,也使得程序...

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

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

    理解JavaScript变量作用域.pdf

    理解JavaScript变量作用域.pdf 本人还有几十本经典javascript书籍以及无数javascript资料,要的加我qq 568094881,本人网址:www.maoshanhai.com

    js作用域基本介绍.doc

    - **变量定义机制**:变量在哪个作用域中定义,就只能在该作用域或其下级作用域中使用。例如,全局作用域中的变量可以在任何地方使用,而局部作用域中的变量只能在其内部使用。 - **变量使用机制**:当需要使用...

    浅析JavaScript中作用域和作用域链

    4. **作用域链**:当在某个作用域中尝试访问一个变量时,JavaScript会沿着作用域链进行查找。作用域链是由当前执行环境的变量对象和所有包含它的父级执行环境的变量对象组成的链式结构。如果在当前作用域找不到变量...

Global site tag (gtag.js) - Google Analytics