博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个有意思的js实例,你会吗??[原创]
阅读量:5359 次
发布时间:2019-06-15

本文共 1285 字,大约阅读时间需要 4 分钟。

  首先,看看下面一个js例子,你觉得会输出什么呢?

function   fn(a){    a();    function a(){        console.log(2);    }    var a = function(){        console.log(3);    }}fn(function(){console.log(1)});

  如果你看不出来,可以copy到浏览器中试试喔。

  本人已经在IE,Firefox,360浏览器下测试过,这段代码都输出2。这时,一些人就会有疑问,为什么呢,为什么不是1和3呢,其实,是这样的:

var a = function(){console.log(3);}是预先"编译"好的,参数function(){console.log(1)}是在创建执行环境时创建的,而function a(){ console.log(2);}是

在运行时即时"编译"的,所以,参数a覆盖var a, function a()又覆盖参数a,所以最后打印2。可明白?

  谢谢1楼和2楼的建议,纠正之前“编译”的说法,因为是不需要“编译”,它是通过js解释器解释执行的。这段代码的执行顺序如下:

  

function   fn(a){    var a;     function a(){        console.log(2);    }    a();     a = function(){        console.log(3);    }}fn(function(){console.log(1)});

 

  再看看,下面一个例子,你能猜出结果么?

  

function fn(a) {            a();            var a = function () {                console.log(3);            }        } fn(function () { console.log(1) });

  结果是1,相信你也能想到,道理跟前面一样。

  再看下面的例子。

  

function fn(a) {            var a = function () {                   console.log(3);            }            a();        }fn(function () { console.log(1) });

  最后的结果是3,为什么呢,虽然参数a会在创建执行环境时覆盖var a,但是,因为运行时执行a()之前,又执行了一遍var a = function () {   console.log(3);},

再次编译,又覆盖参数a,所以最后打印3。(这是我的理解,有不同意见,可以在下面发表评论喔)

  希望对你有用喔,有问题可以评论一起交流哦~

 

 

 

 

转载于:https://www.cnblogs.com/suixinpeng/p/3520343.html

你可能感兴趣的文章
[BZOJ2938] 病毒
查看>>
CSS: caption-side 属性
查看>>
CSS3中box-sizing的理解
查看>>
AMH V4.5 – 基于AMH4.2的第三方开发版
查看>>
Web.Config文件配置之配置Session变量的生命周期
查看>>
mysql导入source注意点
查看>>
linux下编译安装nginx
查看>>
ArcScene 高程不同的表面无法叠加
查看>>
[ONTAK2010] Peaks
查看>>
DLL 导出函数
查看>>
windows超过最大连接数解决命令
查看>>
12个大调都是什么
查看>>
angular、jquery、vue 的区别与联系
查看>>
a标签添加点击事件
查看>>
Context.startActivity出现AndroidRuntimeException
查看>>
Intellij idea创建javaWeb以及Servlet简单实现
查看>>
代理网站
查看>>
Open multiple excel files in WebBrowser, only the last one gets activated
查看>>
FFmpeg进行视频帧提取&音频重采样-Process.waitFor()引发的阻塞超时
查看>>
最近邻与K近邻算法思想
查看>>