js - AO链 与 function
先来看一下demo,如果你已经看出三个console.log分别输出什么。那直接关闭此笔记
function t(age) {
console.log(age);
var age = 99;
console.log(age);
function age() {
}
console.log(age);
}
t(5);
答案揭晓:第一次输出age()函数,第二次输出99,第三次输出99

如果你猜不到答案且一脸懵逼,请继续往下看,请注意,其实一点都不难,甚至知识点你都已经掌握,只是场景和demo的问题让你一时间转不过来
先来分析第一个console.log(age),按照我们正常的程序运行流程理解,你是不是觉得:t(5)传入了形参5.那么第一个输出的也应该是5才对吧?为什么会输出age函数?它又还没被执行声明。
带着这个疑问我们来看看另一个简单的demo:

运行这段代码,会弹出提示框“123”。无论你觉得正常也好,觉得奇怪也好。但我们得出一个结论:
在一段函数代码块中【function fuck()】,函数【function you()】会自动被提前声明,哪怕还没有执行到它。这是javascript一个很“贴心”的机制。 规则1: 形参 < 函数定义。 由于形参先声明,函数(自动)后声明。 于是同名形参you,会被同名的函数you替换掉。所以才会弹出提示框“123”。
带着这个javascript这个“贴心”的机制,我们回到第一个console.log,不难理解,其实本该输出的形参"5",就是被自动声明的age函数给替换掉了。所以输出了age函数
再来看看第二个console.log,程序继续往下执行
var age = 99;
这时,age函数又被99替换,所以第二个输出是99
程序继续往下执行,此时我们看到的
function age() {
}
由于这一句已经被javascript的“贴心”机制提前声明执行了。所以这里不会再执行,所以让我们跳过这一句。
执行最后一句console.log(age); 理所当然不变的输出了99。
规则2: 函数定义 < var变量定义 由于函数先执行,var后执行,所以同名的函数会被var定义的同名变量所覆盖
最后总结:只有函数代码块内,出现定义了函数的情况,才需要注意这些细节,否则按照正常的程序流程顺序执行即可。
以上!!
练习题1:

请在不执行代码的情况下,推导出两次console.log分别输出什么值?
答案:第一次输出“mp”,第二次输出you函数。
解析:请注意,这里的function是通过var进行变量定义的。属于var变量定义(规则2)。
也就是说,实际上这段代码并没有出现【函数中定义函数】的情况,
所以这段代码只需要按照正常的程序流程执行推导即可。
练习题2:

上一题的变形, 请在不执行代码的情况下,推导出两次console.log分别输出什么值?
答案:第一次输出123,第二次输出you函数。
js - AO链 与 function的更多相关文章
- 第十九篇 js高级知识---词法分析和AO 链
上面一篇文章说了js的作用域链,这一节算是对上面的延申,有一个典型的例子,首先看原来的一段代码: var name = "test"; function t() { var b = ...
- js高级知识---词法分析和AO 链
转载自https://www.cnblogs.com/OceanHeaven/p/4957704.html 上面一篇文章说了js的作用域链,这一节算是对上面的延申,有一个典型的例子,首先看原来的一段代 ...
- JS原型链
JS作为发展了多年了对象语言,支持继承,和完全面向对象语言不同的是,JS依赖原型链来实现对象的继承. 首先JS的对象分两大类,函数对象和普通对象,每个对象均内置__proto__属性,在不人为赋值__ ...
- 深入分析JS原型链以及为什么不能在原型链上使用对象
在刚刚接触JS原型链的时候都会接触到一个熟悉的名词:prototype:如果你曾经深入过prototype,你会接触到另一个名词:__proto__(注意:两边各有两条下划线,不是一条).以下将会围绕 ...
- Js 职责链模式 简单理解
js 职责链模式 的简单理解.大叔的代码太高深了,不好理解. function Handler(s) { this.successor = s || null; this.handle = funct ...
- JS原型链简单图解
JS中原型链,说简单也简单. 首先明确: 函数(Function)才有prototype属性,对象(除Object)拥有__proto__. 首先,我画了一张图. 所谓原型链,指的就是图中的proto ...
- js原型链与继承(初体验)
js原型链与继承是js中的重点,所以我们通过以下三个例子来进行详细的讲解. 首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询 ...
- JS 原型链图形详解
JS原型链 这篇文章是「深入ECMA-262-3」系列的一个概览和摘要.每个部分都包含了对应章节的链接,所以你可以阅读它们以便对其有更深的理解. 对象 ECMAScript做为一个高度抽象的面向对象语 ...
- js作用域链
js作用域链 <script> var up = 555; function display(){ var innerVar = 2; function inner(){ var inne ...
随机推荐
- jquery 功能强大的下拉菜单
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org ...
- cmd下载文件
进入cmd 输入ftp 192.168.1.200 然后按照提示输入用户名和密码 cd 进入要下载的目录 dir 看操作权限 lcd查看本地要装下载文件的目录 prompt关闭交互模式 mget da ...
- UIWebView & javascript
http://blog.163.com/m_note/blog/static/208197045201293015844274/ UIWebView是IOS SDK中渲染网面的控件,在显示网页的时候, ...
- CodeForces 701C They Are Everywhere(map的应用)
这个题比较好的解决办法,我觉得还是map,map的size可以很快的知道我们选了几个字母,而且可以作为计数器,知道每一个字母出现了多少次, erase函数可以清除掉一个元素. 所以,定义两个指针L和R ...
- Ubuntu + Django + Nginx + uwsgi
环境 Ubuntu 14.04 Python 2.7 Django 1.8.4 1 安装Nginx sudo apt-get install nginx 测试 sudo /etc/init. ...
- Python -- Web -- WSGI
WSGI:Web Server Gateway Interface 只要求Web开发者实现一个函数,就可以响应HTTP请求. # hello.py def application(environ, s ...
- IDL 实现 EOF(经验正交函数分析)
关于EOF详细介绍请wiki http://en.wikipedia.org/wiki/Empirical_orthogonal_functions或者Google之. 与PCA一样,EOF也是遥感多 ...
- Review Board的使用
代码审核工具.先在命令行界面,进入到工程的Main目录下,然后使用命令 svn diff>yus.diff 这样就将Main里面的所有内容生成了,然后在浏览器里进入到自己的Review Boa ...
- Django: 之数据库完美解析
Python的web矿建有Django.Tornado.Flask等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定,模版引擎.缓存.Session等诸多功能. ...
- springframwork历史版本下载地址
http://sourceforge.net/projects/springframework/files/springframework-2/