![技术人员求职必看之Javascript词法作用域.doc_第1页](http://file.renrendoc.com/FileRoot1/2020-1/11/018e47cd-cb31-4a02-a312-598730b604a4/018e47cd-cb31-4a02-a312-598730b604a41.gif)
![技术人员求职必看之Javascript词法作用域.doc_第2页](http://file.renrendoc.com/FileRoot1/2020-1/11/018e47cd-cb31-4a02-a312-598730b604a4/018e47cd-cb31-4a02-a312-598730b604a42.gif)
![技术人员求职必看之Javascript词法作用域.doc_第3页](http://file.renrendoc.com/FileRoot1/2020-1/11/018e47cd-cb31-4a02-a312-598730b604a4/018e47cd-cb31-4a02-a312-598730b604a43.gif)
全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
技术人员求职必看之Javascript词法作用域每个人都会犯错有时候孰能无过,过而能改,善莫大焉,有时候知道自己错了却没有机会更改。其实,错了并不仅仅是错了,做错了,除了及时改正和弥补之外,最重要的是为自己犯的错承担所有责任。2009年3月14日,我去参加网易互动的专场招聘会,应聘网页工程师的职位。有幸参加笔试,然后有幸栽在笔试,呵呵。废话少说,抓出影响极深的一题重新研究研究。题目大概是:写出如下代码的输出结果并进行分析var tt = aa;function test()alert(tt);var tt = dd;alert(tt);test();“太简单了!”这是我当时看到这个题目是的第一想法,于是轻率答题竟成我的致命之伤。我的答案是aa和dd,解析:第一次输出全局变量的结果,然后局部变量tt覆盖全局变量所引用的值,所以第二次输出结果是dd。任何人见我如此作答,都会认为我是在扫盲想法及其幼稚(我也这么认为)!网易啊,怎么可能会满意于这种答案!正确的答案应该是:undefined和dd为什么第一次alert的结果是undefined呢?要解释得清楚明白需要用到Javascript的词法作用域。Javascript中的函数“在定义它们的作用域里运行,而不是在执行它们的作用域里运行”,这是权威指南里抽象而精辟的总结。Javascript的逻辑默认在一个全局作用域中执行,如以上程序段中的“var tt=aa;”就是定义一个全局作用域的全局变量(如果以上代码段不是摘自某个函数链的话)。而test()函数内部的逻辑必须在原有的作用域(全局作用域)链再添加test函数本身的作用域(局部性)这些思想几乎在每一种语言中都是如此定义的,然而Javascript作用域链的特别之处在于函数内部能够嵌套函数的定义(这是闭包的基础。注:在JS中函数是唯一形式的代码作用域)嵌套的内部函数可以调用外部函数(被嵌套的函数)的变量和其他嵌套函数(函数是一种数据)。如果是在外部函数内调用嵌套函数,那么调用对象不变,当外部函数执行完毕后所有数据(包括外部函数和嵌套的内部函数)都将被垃圾回收机制收集这一点还不能体现出闭包的精华。有一种情况,就是Javascript允许外部调用嵌套的内部函数,即使被嵌套函数已经被垃圾收集最常见的就是在某个函数中用其嵌套的内部函数定义某些元素的响应事件,页面载入的时候被嵌套函数(某个函数)已经执行完毕(被垃圾回收),但当事件触发的时候仍然会有响应的动作,而且响应函数中还可能调用到在被嵌套函数(某个函数)中定义的变量最终值(不是被垃圾回收了吗?)。关于闭包的知识和示例有很多资料可供查询,我不想叙述。本文的重点是以下非常重要的细节:调用对象位于作用域链的前端,局部变量(在函数内部用var声明的变量)、函数参数及Arguments对象都在函数内的作用域中这意味着它们隐藏了作用域链更上层的任何同名的属性。即,在以上程序片段中,test函数内部的“var tt=dd”将会致使“var tt=aa”在test函数被调用时完全被隐藏。而且,tt是在第一个alert语句之后定义,所以在调用到第一个alert时,tt是还没有被赋值的。这样说可能会清楚一点,即,在定义test函数时,当定义第一个alert(tt)时,这里会记录tt是作用域链中的一个变量但不会记录它(tt)的值,函数定义完毕后tt就添加到作用域里,所以第一个alert语句能够找到该作用域里的tt(即,相当于找到一个已经在函数内部声明,但未被赋值的tt)。以上程序片段的执行结果与以下片段的结果相同:var tt = aa;function test()var tt;alert(tt);tt = dd;alert(tt);test();Javascript的作用域不可简单的用C+等语言的思维来理解啊!C+在调用函数之前必须先声明或定义,而Javascript没必要。在Javascript中可以先调用函数,后再定义(不用在调用之前作任何声明)。因为在调用函数时,Javascript是向作用域链要函数的定义(函数在定义它们的作用域里运行,而不是在执行它们的作用域里运行)如以上代码写成:var tt = aa;test(); /先调用后再定义function test()alert(tt); /undefinedvar tt = dd;alert(tt); /dd以上代码片段虽然能够得到相同的结果,但最好不要那样写啦,习惯不好,代码不好维护。 重申一下本文的重点:函数在定义它们的作用域里运行,而不是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度公共设施门窗安装及售后服务合同
- 2025年健身房私教职业发展合同
- 2025年度会展中心场地租赁合同(含舞台搭建服务)
- 2025年度内墙抹灰质量保证劳务分包合同
- 2025年度互联网企业股权收购合同样本
- 2025年度企业培训资源整合与共享合同
- 2025年度城市货运物流简易运输合同范本
- 2025年度大数据分析项目用工服务合同
- 2025年度城市地下空间开发施工包工合同(空间利用)
- 2025年度护墙板环保认证与市场推广服务合同
- 日语专八分类词汇
- GB/T 707-1988热轧槽钢尺寸、外形、重量及允许偏差
- GB/T 33084-2016大型合金结构钢锻件技术条件
- 高考英语课外积累:Hello,China《你好中国》1-20词块摘录课件
- 化学选修4《化学反应原理》(人教版)全部完整PP课件
- 茶文化与茶健康教学课件
- 降水预报思路和方法
- 虚位移原理PPT
- QE工程师简历
- 辅音和辅音字母组合发音规则
- 2021年酒店餐饮传菜员岗位职责与奖罚制度
评论
0/150
提交评论