通俗易懂JavaScript作用域(三)

上述两篇博客主要带大家分析了两个有点迷糊的Demo,但是关于作用链的知识还是没有出现,下面我们再来做一个变形。

变形二

<span style="font-family:SimSun;font-size:18px;"><script>
        var a = 1;
        function fn1() {
            alert(a);
            a = 2;
            alert(a);
        }
        fn1();

    </script></span>

代码分析

这个例子只不过是上篇博客中例子的一部分,但是涉及到了作用链的东东。下面再来分析一下。

 1.JS预解析

就不多废话了,直接出结果

2.解读代码

在解读过程中,当遇到函数调用时,我们知道又将开始上述过程:JS预解析——代码执行,解析结果是:

我们发现跟上图并并没有区别,那么开始执行吧!

当执行fn1()函数中的alert(a)时,此时有趣的事情发生了,作用链机制就出现了,通过上图发现,fn1()函数块的圈子里面并没有有关a的定义,那么该怎么办呢?

此时,就会通过作用链机制,向上一级查找,直到找到为止。效果图如下:

所以我们发现执行fn1()中的alert(a)时,通过作用链,找到外围圈子中的a,输出结果来。

接着向下执行,当执行fn1()中的第二个alert(a)时,由于在此圈子中已经为a赋值为2,所以紧接着会输出结果2.

这就是所谓的作用链机制,再查找变量的时候,会自底向上,一层一层的查找,直到找到为止。

时间: 2024-11-06 23:06:14

通俗易懂JavaScript作用域(三)的相关文章

通俗易懂JavaScript作用域(一)

记得第一次接触JS的时候,就被JS中的作用域搞得晕头转向,估计初学者也会遇到这个问题,对JS中的作用链了解的不是很深刻.今天小编就带大家来揭开这层神秘的面纱. 初来乍到 在网上找这方面材料的时候,碰到一个人在面试的时候关于JS的试题,如下: <span style="font-family:SimSun;font-size:18px;"><script> alert(a); var a = 1; alert(a); function a() { alert(2)

通俗易懂JavaScript作用域(二)

紧接着上篇文章,在上篇的基础上来做一个变形. 变形一 先看一下下面的Demo <span style="font-family:SimSun;font-size:18px;"><script> var a = 1; function fn1() { alert(a); a = 2; } function fn1(a){ alert(a); a = 2; } fn1(); alert(a); var a = 1; function fn1(a){ alert(a)

JavaScript作用域原理(三)——作用域根据函数划分

一.一个for实例 <p id="scope3" style="color:red"></p> var pscope3 = document.getElementById('scope3'); function scope3() { for(var i=0; i<10; i++){ } echo(pscope3, i); } scope3(); 1.函数在java.C#等语言中,变量i只会在for循环语句中有定义,循环结束,i也就被销毁

深入理解javascript作用域系列第三篇

前面的话 一般认为,javascript代码在执行时是由上到下一行一行执行的.但实际上这并不完全正确,主要是因为声明提升的存在.本文是深入理解javascript作用域系列第三篇--声明提升(hoisting) 变量声明提升 a = 2 ; var a; console.log( a ); 直觉上,会认为是undefined,因为var a声明在a = 2;之后,可能变量被重新赋值了,因为会被赋予默认值undefined.但是,真正的输出结果是2 console.log( a ) ; var a

深入理解javascript作用域系列第三篇——声明提升(hoisting)

× 目录 [1]变量 [2]函数 [3]优先 前面的话 一般认为,javascript代码在执行时是由上到下一行一行执行的.但实际上这并不完全正确,主要是因为声明提升的存在.本文是深入理解javascript作用域系列第三篇——声明提升(hoisting) 变量声明提升 a = 2 ; var a; console.log( a ); 直觉上,会认为是undefined,因为var a声明在a = 2;之后,可能变量被重新赋值了,因为会被赋予默认值undefined.但是,真正的输出结果是2 c

深入理解javascript作用域系列第一篇——内部原理

× 目录 [1]编译 [2]执行 [3]查询[4]嵌套[5]异常[6]原理 前面的话 javascript拥有一套设计良好的规则来存储变量,并且之后可以方便地找到这些变量,这套规则被称为作用域.作用域貌似简单,实则复杂,由于作用域与this机制非常容易混淆,使得理解作用域的原理更为重要.本文是深入理解javascript作用域系列的第一篇——内部原理 内部原理分成编译.执行.查询.嵌套和异常五个部分进行介绍,最后以一个实例过程对原理进行完整说明 编译 以var a = 2;为例,说明javasc

JavaScript 开发进阶:理解 JavaScript 作用域和作用域链

作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript. JavaScript作用域 任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期.在JavaScript中,变量的作用域有全局作用域和局部作用域两种. 1.  全局作用域(Global S

JavaScript作用域和作用域链

JavaScript 开发进阶:理解 JavaScript 作用域和作用域链 来源:梦想天空  http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html 作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript. Java

五个小例子教你搞懂 JavaScript 作用域问题

众所周知,JavaScript 的作用域和其他传统语言(类C)差别比较大,掌握并熟练运用JavaScript 的作用域知识,不仅有利于我们阅读理解别人的代码,也有助于我们编写自己的可靠代码. 下面笔者将使用五个小例子来给大家分析下 JavaScript 的作用域要注意的问题. 感谢 例子的来源 (这5个例子我做错了2个 [嘿嘿,尽情鄙视吧],笔者就是要 死磕自己,奉献大家!) 先给出五个例子: 每个例子旁边都会给出答案的链接,如果你全部都正确了,你可以忽略这篇短文,并深深的鄙视下笔者. 例一: