首先,看看下面一个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。(这是我的理解,有不同意见,可以在下面发表评论喔)

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

一个有意思的js实例,你会吗??[原创]的更多相关文章

  1. 一个有意思的js块作用域问题

    1.问题 首先把问题放出来,昨天看了一个掘友发的一个问题,然后跟我同事一起研究了一下,没找出来是为什么,然后我回来一直在想为什么,然后各种找资料研究,从各个方面找为什么,比如js上下文,作用域,js垃 ...

  2. 一个有意思的js小问题

    问题:如何实现以下函数? add(2, 5); // 7 add(2)(5); // 7 第一个就不用说了,很简单,关键是看第二个,add(2)(5),可见add(2)应该返回的是一个函数,这个函数再 ...

  3. 创建node.js一个简单的应用实例

    在node.exe所在目录下,创建一个叫 server.js 的文件,并写入以下代码: //使用 require 指令来载入 http 模块 var http = require("http ...

  4. 仿照jquery封装一个自己的js库(一)

    所谓造轮子的好处就是复习知识点,加深对原版jquery的理解. 本文系笔者学习jquery的笔记,记述一个名为"dQuery"的初级版和缩水版jquery库的实现.主要涉及知识点包 ...

  5. JS实例

    JS实例 1.跑马灯 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  6. JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记3

    技术很多,例子很多,只好慢慢学,慢慢实践!!现在学的这本书是[JavaScript实战----JavaScript.jQuery.HTML5.Node.js实例大全] JavaScript.jQuer ...

  7. JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记2

    技术很多,例子很多,只好慢慢学,慢慢实践!!现在学的这本书是[JavaScript实战----JavaScript.jQuery.HTML5.Node.js实例大全] JavaScript.jQuer ...

  8. JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记1

    技术很多,例子很多,只好慢慢学,慢慢实践!!现在学的这本书是[JavaScript实战----JavaScript.jQuery.HTML5.Node.js实例大全] 第 3 章 用 JavaScri ...

  9. Vue.js实例

    构造器 每个 Vue.js 应用都是通过构造函数 Vue 创建一个 Vue 的根实例 启动的: var vm = new Vue({ // 选项 })

随机推荐

  1. Ubuntu升级显卡驱动后开机无动画的解决办法

    我的联想Ideapad z460,Nvidia GEFORCE 310M的显卡,安装闭源的驱动非常的蛋疼,ubuntu下面有附加驱动管理,在里面直接就能安装,也可以到官网下载.run的安装包,比较的折 ...

  2. hihocoder 1049 后序遍历

    #1049 : 后序遍历 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在参与过了美食节之后,小Hi和小Ho在别的地方又玩耍了一阵子,在这个过程中,小Ho得到了一个非常 ...

  3. Lombok 安装

    Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO).它通过注释实现这一目的.通过在开发环境中实现 Lombok ,开发人 ...

  4. Agile.Net 组件式开发平台 - 数据报表组件

    Agile.Report.dll 文件为平台数据报表支持库,基于FasstReport.Net扩展重写,提供了非常强大的自定义报表的功能使开发者为应用程序快速有效地生成报表.报表类库提供了创建报表所需 ...

  5. 浏览器userAgent大全

    iPhone ●iOSMozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Versi ...

  6. AjaxFileUpload 在C#中应用

    一.前台页面 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head ru ...

  7. opencv 手写选择题阅卷 (三)训练分类器

    opencv 手写选择题阅卷 (三)训练分类器 1,分类器选择:SVM 本来一开始用的KNN分类器,但这个分类器目前没有实现保存训练数据的功能,所以选择了SVN分类器; 2,样本图像的预处理和特征提取 ...

  8. 04_例子讲解:rlViewDemo.exe

    参考资料:http://www.roboticslibrary.org/tutorials/first-steps-windows 使用rlViewDemo对应的快捷方式启动程序,可以看到如下界面: ...

  9. Guzz

    http://www.cnblogs.com/shitou/archive/2011/05/31/2064838.html

  10. 个人站长如何使用svn发布到服务器不遗漏文件

    作为个人站长,最最头疼的一件事情就是在本地开发好代码之后,上传的时候要去服务器上一个一个文件进行覆盖,添加操作:是人难免出错,避免这种情况的方法: 开发者最好是在本地有一个代码库,创建好代码库之后,至 ...