通俗易懂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);
            a = 2;
        }
        fn1();
        alert(a);
    </script></span>

代码分析

看了一下上述代码,有木有另外一种晕头转向的感觉,这又是何方神圣,看不懂哈!没事,慢慢的来分析。

还是按照我上篇博客提到的分析的几个步骤,来分析一下。

1.找点玩意

在浏览器中解析预先解析的时候,就是先找一些var、function的东西,然后经过PK后放置到一个仓库里面。并且PK的等级是  var——function   function(先来)——function(后来)。经过PK后,仓库中放置的东西如下:

2.逐行解读代码

经过JS的预解析后,开始从上至下执行代码,当执行到fn1()码的时候,怪异的事情出现了,因为fn1()是调用函数块,所以又开始了上述的两个过程,解析——解读,好了经过解读后,看看仓库中有什么样的变化。

 

为何会又多出一个a呢?在这次解析中,并没有发现var的出现啊,a前面并没有哈,为何会多出来一个a呢?大家不要忘了,在解析fn1(a)的时候,其中的a就相当于fn1(var a),所以问题就在这里,在此就多出来一个var的效果,所以才会出现上述的结果。

3.在此执行解析出来的代码

所以当执行alert(a)时,因为在当初解析的时候赋值为undefined,所以会弹出undefined的窗口。

执行完后的结果如下

接下向下执行,alert(a),这时候就知道记过了吧!弹出的肯定是1哈。

未完待续



时间: 2024-11-05 02:18:47

通俗易懂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; alert(a); } fn1(); </script></span> 代码分析 这个例子只不过是上篇博客中例子的一

JavaScript作用域原理(二)——预编译

JavaScript是一种脚本语言, 它的执行过程, 是一种翻译执行的过程.并且JavaScript是有预编译过程的,在执行每一段脚本代码之前, 都会首先处理var关键字和function定义式(函数定义式和函数表达式). 一.变量执行之前,会被赋为undefined <p id="scope2" style="color:red"></p> function echo(p, html) { p.innerHTML += html + '&l

Ext JS学习第三天 我们所熟悉的javascript(二)

•javascript之函数 •对于Ext开发者,我还是希望你能对javascript原生的东西非常了解.甚至熟练掌握运用.那么函数,无疑是非常重要的概念.首先在前面一讲,我们知道了函数也是一种数据类型,创建函数一共有三种方式.每种方式他们都会有区别,分别为: –function语句形式 –函数直接量形式 –构造函数形式 •函数中的arguments对象 –argument的作用一:接受函数的实际参数 –argument的作用二:用于做递归操作 栗子代码 1 //Function 函数 2 //

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

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

Python自动化 【第十六篇】:JavaScript作用域和Dom收尾

本节内容: javascript作用域 DOM收尾 JavaScript作用域 JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走遍天下都不怕... 一.JavaScript中无块级作用域 在Java或C#中存在块级作用域,即:大括号也是一个作用域. 1 public static void main () 2 { 3 if(1==1){ 4 String name = "seven"; 5 } 6 System.o

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中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里.” 在JavaScript中,作用域的概念和其他语言差不多,在每次调用一个函数的时候,就会进入一个函数内的作用域,当从函数返回以后,就返回调用前的作用域. 验证下刚那句权威指南中的话: <p id="scope1" style="color:red"></p> function ec

JavaScript作用域、上下文环境、函数对象的定义与调用、匿名函数的定义与调用、闭包

提到闭包总给人很高深的感觉,网上的例子也数不胜数.但是我发现相当一部分并不容易理解.根据我的观察,是因为这些例子把标题中提到的概念糅杂在了一起,往往越看越糊涂.所以我希望化整为零,拆成简单例子来解释. 1.先看作用域: JavaScript作用域只有两种--全局作用域和函数内作用域,没有代码块作用域.示例: function loop(){ for(var i=0;i<5;i++){ //doSomething; } alert(i); } loop(); //执行函数结果为5. 尽管变量i已经