资讯专栏INFORMATION COLUMN

匿名函数预解析思考

lncwwn / 2040人阅读

摘要:关于中的预解析相信对有所了解的程序猿都知道举个例子上面的这个例子会弹出解析过程中的函数绝对是一道美丽的风景那么有匿名函数存在时是怎么解析的呢下面看几个例子从中一窥究竟实例对于使用语句声明的函数解释器就会在预编译期间把函数处理这个处理就是建立

关于Js中的预解析相信对js有所了解的程序猿都知道,举个例子:

alert(a);
var a = 10;

上面的这个例子会弹出 undefined ,解析过程:var a; alert(a);a = 10;

javascript中的函数绝对是一道美丽的风景,那么有匿名函数存在时,是怎么解析的呢?下面看几个例子,从中一窥究竟.

实例1

  alert(f);  // function f(){alert(2);}
  function f(){
    alert(1);
}
alert(f); // function f(){alert(2);}
f();  // 2
function f(){
    alert(2);
}
f();  // 2

对于使用function语句声明的函数,js解释器就会在预编译期间把函数处理,这个处理就是建立函数索引.

所以预解析期间对函数f建立索引,程序从上往下执行,函数f指向function f(){alert(1);},继续往下,还有一个函数f,此时将第一建立的索引覆盖掉,此时函数f指向的是function f(){alert(2);}.到这里预解析阶段结束,然后进行执行,第一次alert 显然弹出function f(){alert(2);},第二次同样也是,f()执行弹出2,第二次f()也同样弹出2.

实例2

        alert(f);//  function(){alert(2);}
        var f = function(){
            alert(1);
        }
        alert(f);// 1
        f(); //1
        function f(){
            alert(2);
        }
        f();// 1
        alert(f); // function(){alert(1)}

实例2实例1 相比,将第一个函数f写成了匿名函数,预编译阶段,对匿名函数不做任何处理,直到执行期才按表达式逐行进行解释,所有返回的结果就不一样了.预解析期间得到的函数是function f(){alert(2);},但是执行到匿名函数,将函数f重新赋值了,改变了函数f.

实例3

        alert(f);//   undefined
        var f = function(){
            alert(1);
        }
        f(); //  1
        var f = function(){
            alert(2);
        }
        f();//  2

两个都是匿名函数,在预解析期间都没有执行,所以第一次是undefined,之后进行赋值运算,依次显示12

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78575.html

相关文章

  • 浅谈JavaScript作用域

    摘要:我们在面试时,总会碰到一些奇奇怪怪的关于作用域的面试题,其实弄清楚原理,万变不离其宗,大部分的面试题都可以得姐。 showImg(https://segmentfault.com/img/bV7Cri?w=1563&h=879); 我们在面试时,总会碰到一些奇奇怪怪的关于 作用域 的面试题,其实弄清楚原理,万变不离其宗,大部分的面试题都可以得 ‘姐’。 所以,今天我们来谈谈 JavaS...

    figofuture 评论0 收藏0
  • ECMA_作用域深入&This关键字

    摘要:预解析声明告知浏览器在全局作用域中有一个变量名为的变量。执行代码的就是栈内存,作用域也是栈内存。关键字在中主要研究都是函数中的中的代表的是当前行为执行的主体方法,函数,事件中的上下文代表的是当前行为执行的环境区域例如小明在沙县小吃吃蛋炒饭。 基本认识 数据类型 基本数据类型 string, number, null, boolean, undefined 引用数据类型 object: ...

    Harriet666 评论0 收藏0
  • 爬虫不得不学之 JavaScript 函数对象篇

    摘要:所以语句也会常常用于终止函数的运行,还有也可以不写语句,但是会默认返回函数内部的对象中,函数的内部都有一个对象,用来记录在调用函数时所传进来的参数,可以说是一个伪数组。里面使用了关键字,这个的指向就是使用构造函数创建的对象,也不需要返回对 今天好像是情人节?所以最适合面向对象,JavaScript 也有对象,我们也可以随时面向对象,方便得很,那怎样才有对象呢?下面告诉你! 1. 数组 ...

    Terry_Tai 评论0 收藏0
  • 体验javascript之美第四课--函数函数表达式、闭包

    摘要:大彬哥版权所有翻录必究尼古拉斯屌大彬哥群尼古拉斯屌大彬哥函数声明函数表达式是不是简单的让人发指区别就一句话,函数声明,可以在函数调用之后,因为有函数预解析。而函数表达式必须在调用之前。 通过前三课讲解,大家应该能做到 1.手里有一份随时能够换工作自信的简历 2.知道了学习js的正确姿势 3.理解了全局对象、全局上下文、知道有预解析同时做了至少50道面试题 4.能熟练的使用json构建...

    Doyle 评论0 收藏0
  • 立即执行函数表达式(IIFE)

    摘要:另外,如果你想跳过这里,你可以直接跳到立即调用函数表达式进行阅读,但是我建议你读完整篇文章。当圆括号包裹函数时,它会默认将函数作为表达式去解析,而不是函数声明。 原文:Immediately-Invoked Function Expression (IIFE) by Ben Alman原译:立即执行函数 by Murphywuwu改增内容: by blanu 也许你没有注意到,我是一个...

    Yu_Huang 评论0 收藏0

发表评论

0条评论

lncwwn

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<