一个有意思的js实例,你会吗??[原创]
首先,看看下面一个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实例,你会吗??[原创]的更多相关文章
- 一个有意思的js块作用域问题
1.问题 首先把问题放出来,昨天看了一个掘友发的一个问题,然后跟我同事一起研究了一下,没找出来是为什么,然后我回来一直在想为什么,然后各种找资料研究,从各个方面找为什么,比如js上下文,作用域,js垃 ...
- 一个有意思的js小问题
问题:如何实现以下函数? add(2, 5); // 7 add(2)(5); // 7 第一个就不用说了,很简单,关键是看第二个,add(2)(5),可见add(2)应该返回的是一个函数,这个函数再 ...
- 创建node.js一个简单的应用实例
在node.exe所在目录下,创建一个叫 server.js 的文件,并写入以下代码: //使用 require 指令来载入 http 模块 var http = require("http ...
- 仿照jquery封装一个自己的js库(一)
所谓造轮子的好处就是复习知识点,加深对原版jquery的理解. 本文系笔者学习jquery的笔记,记述一个名为"dQuery"的初级版和缩水版jquery库的实现.主要涉及知识点包 ...
- JS实例
JS实例 1.跑马灯 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记3
技术很多,例子很多,只好慢慢学,慢慢实践!!现在学的这本书是[JavaScript实战----JavaScript.jQuery.HTML5.Node.js实例大全] JavaScript.jQuer ...
- JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记2
技术很多,例子很多,只好慢慢学,慢慢实践!!现在学的这本书是[JavaScript实战----JavaScript.jQuery.HTML5.Node.js实例大全] JavaScript.jQuer ...
- JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记1
技术很多,例子很多,只好慢慢学,慢慢实践!!现在学的这本书是[JavaScript实战----JavaScript.jQuery.HTML5.Node.js实例大全] 第 3 章 用 JavaScri ...
- Vue.js实例
构造器 每个 Vue.js 应用都是通过构造函数 Vue 创建一个 Vue 的根实例 启动的: var vm = new Vue({ // 选项 })
随机推荐
- 20个2014年最优秀的PHP框架
http://www.php100.com/html/it/mobile/2014/0813/7198.htmlhttp://medoo.in/api/select
- Servlet & JSP - getParameter 与 request.getAttribute 的区别
getParameter 方法获取的是表单或 URL 的请求参数.参数是从 Web 客户端传递至 Web 服务端.例如有如下的 servlet: @WebServlet(name = "he ...
- Debian8 加载NTFS 磁盘出错 解决方法
执行 ntfsfix /dev/sdb2 // sd* a代表第一块硬盘 b代表第2块硬盘 数字是分区号 执行后 就可以正常使用了.
- Swift下标
还记得字典吗? var numberOfLegs= ["spider": 8,"ant": 6, "cat":4] numberOfLegs ...
- jquery实现2级联动
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- .htaccess文件 使用
.htaccess文件 用法1:自错误页面 ErrorDocument 404 /error/404.html ErrorDocument 403/error/403.html 用法2:重定向 Red ...
- XML解析——Java中XML的四种解析方式
XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四 ...
- dorado7 重装了tomcat后配置路径
在Windows->Preferences->Server->Runtime Environments把先前的工程Servers删除掉
- 3月3日[Go_deep]Populating Next Right Pointers in Each Node
原题:Populating Next Right Pointers in Each Node 简单的链表二叉树增加Next节点信息,没什么坑.不过还是WA了两次,还是有点菜,继续做,另外leetcod ...
- java学习笔记_GUI(5)
demo如何为不同的button创建对应的响应函数 import javax.swing.*; import java.awt.event.*; import java.awt.*; class My ...