JavaScript functions are a combination of code to be executed and the scope in which to execute them. This combination of code and scope is known as a closure in the computer science literature.All JavaScript functions are closures.
JS是
被执行的代码和
这些代码被执行时所在的作用域的结合。这种代码和作用域的结合在计算机科学文献中被称作闭包。所有的JS函数都是闭包。
这与印象中闭包差别挺大,尤其是最后1句。
var values=(function(){
var id=0;
return function(){
return id++;
}
})();
按我的理解,这只是对闭包的一种特殊形式的应用(外部引用指向内嵌函数,使得嵌套函数的call object继续存在),但不能说明只有这个才叫做闭包。闭包是所有JS函数的固有状态。
Lexical Scoping(词法作用域,也称静态作用域)、scope chain(作用域链)、call object(调用对象)很关键、很有难度,它们是闭包的根本。
介绍如下:
scope chain
由一组按次序排列的对象组成的对象,函数查找变量时,首先选择其中的第一个对象,如果该对象中没有,则选择下一个对象,以此类推。
Lexical Scoping:
定义函数时,当前的作用域链便被保存到函数的内部变量中;函数被调用时,启用的就是这个被保存的作用域链,而不是根据执行环境动态地创建。
<script>
var s=0;
function test1(){//当前作用域链被保存
alert(s);
}
function test2(){
var s=1;
test1();//定义它时所保存的作用域链被使用
}
test2();
//0==>词法作用域;1==>动态作用域。
</script>
所以会这样描述词法作用域的功能:函数在定义的它的作用域中执行,而不是执行它的作用域。
调用对象:
调用函数时,首先执行上述动作。然后创建call object(调用对象),将其加入作用域链最前端,也就是函数查找变量时,优先选择该对象。调用对象使用属性arguments进行初始化,该属性指向该函数的Arguments对象。所有命名参数(函数参数列表中的参数)因此都被加入调用对象里。所有以var声明的局部变量也都在该对象中
被定义。
词法作用域与作用域链的关系:前者用来决定函数如何选择作用域链。
作用域链与调用对象的关系:调用函数时,作用域链由定义该函数的作用域链+该函数的调用对象组成。
但定义函数时,作用域链如何构成不清楚:假如存在函数嵌套,定义被嵌套函数的作用域链必然包括外层函数的作用域;外层函数在调用时,作用域链肯定包含其自身的调用对象;但定义被嵌套函数时,外层函数并没有被调用,也就是不存在调用对象,而此时,被嵌套函数又可以访问外层函数的一切参数、变量,那到底是什么使它拥有这种功能?这个矛盾现在无法解释。
分享到:
相关推荐
《JavaScript: The Definitive Guide, 5th Edition》是JavaScript学习领域中一本经典的参考书,由David Flanagan撰写,全面且深入地介绍了JavaScript语言。这本书面向已经有一定编程基础的读者,旨在帮助他们掌握...
《JavaScript The Definitive Guide 5th Edition》是JavaScript编程领域的经典之作,由David Flanagan撰写,面向希望深入理解和熟练掌握JavaScript语言的开发者。这本书详细介绍了JavaScript的核心概念、语法以及...
《JavaScript.The.Definitive.Guide 5th Edition》是一本权威的JavaScript编程指南,由David Flanagan撰写,针对JavaScript的第五版进行了全面的讲解。这本书是JavaScript开发者的重要参考资料,尤其对于那些希望...
《JavaScript The Definitive Guide》第五版是JavaScript编程领域中一本经典的权威教程,由David Flanagan撰写。这本书全面深入地探讨了JavaScript语言的各种特性和用法,为开发者提供了详尽的指导。配合第四版一同...
- **书名**:JavaScript: The Definitive Guide, 5th Edition - **作者**:David Flanagan - **出版社**:O'Reilly - **出版日期**:2006年8月 - **ISBN-10**:0-596-10199-6 - **ISBN-13**:978-0-59-610199-2 - **...
首先,我们来看《javascript - the definitive guide, 5th ed (o'reilly).chm》。这本书是经典的JavaScript指南,由O'Reilly出版社出版,被誉为“犀牛书”。它详尽地阐述了JavaScript的基础语法、对象、函数、DOM...
1. **JavaScript_The_Definitive_Guide_5th_Edition.chm** 这是《JavaScript权威指南》的第五版,由David Flanagan撰写。这本书是JavaScript学习的经典之作,涵盖了语言的基础到高级特性,包括变量、数据类型、...
压缩包中的文件名为"OReilly.JavaScript.The.Definitive.Guide.5th.Edition.Aug.2006.chm",这表明该电子书是由知名出版商O'Reilly Media出版的,其特色是动物封面设计,因此也常被称为“动物书”。".chm"是...
9. **CHM文件**:"JavaScript.The.Definitive.Guide.5th.Edition.chm"是一个Windows帮助文件,通常包含书籍的完整电子版,便于读者搜索和查阅特定知识点。 总的来说,《JavaScript权威指南第五版》是一本详尽的...
这本书的第五版(OReilly.JavaScript.The.Definitive.Guide.5th.Edition.chm)为CHM格式,意味着它是一个Windows帮助文档,方便读者查阅和搜索。 JavaScript,全称ECMAScript,是一种轻量级的解释型编程语言,广泛...
《JavaScript权威指南(第五版)》是一本深入探讨JavaScript编程语言的经典著作,旨在为读者提供全面、详尽的JavaScript知识。这本书适合有一定编程基础的读者,无论你是前端开发者、后端程序员还是全栈工程师,都能...
`oreilly.javascript.the.definitive.guide.5th.edition.aug.2006.chm` 和 `JavaScript 5.CHM` 可能详细介绍了变量、数据类型、函数、对象、DOM操作、事件处理等基础知识,而`OReilly.JavaScript.The.Good.Parts.May...
`JavaScript.The.Definitive.Guide,5th.Edition.chm`是权威指南的第五版,详细讲解了JavaScript语法、对象、函数、原型链、闭包等核心概念,以及异步编程和错误处理等内容。 2. **HTML**:超文本标记语言(HTML)是...
"JavaScript.The.Definitive.Guide,5th.Edition.chm"涵盖了JavaScript的核心概念,包括: - **变量与数据类型**:了解JavaScript的动态类型系统,如字符串、数字、布尔值、null、undefined等。 - **函数与作用域*...