今天我与同事讨论了Javascript中的嵌套函数:
function a() { function b() { alert('boo') } var c = 'Bound to local call object.' d = 'Bound to global object.' }
在这个例子中,试验指出b在a的体外是不可达的,就像c一样.但是,d是 - 执行a()之后.在ECMAScript v.3标准中寻找这种行为的确切定义,我没有找到我正在寻找的确切措辞; 第13节第71页没有说明,是函数声明语句创建的函数对象要绑定到哪个对象.我错过了什么吗?
这是静态范围.函数中的语句在该函数中作用域.
然而,Javascript有一种古怪的行为,即没有var关键字,你就暗示了一个全局变量.这就是你在考试中看到的.你的"d"变量是可用的,因为它是一个隐含的全局变量,尽管它是在函数体内编写的.
另外,回答问题的第二部分:函数存在于声明的任何范围内,就像变量一样.
旁注: 您可能不需要全局变量,尤其不是隐含变量.建议您始终使用var关键字,以防止混淆并保持一切清洁.
旁注: ECMA标准可能不是找到有关Javascript答案的最有用的地方,尽管它肯定不是一个糟糕的资源.请记住,浏览器中的javascript只是该标准的一个实现,因此标准文档将为您提供构建javascript引擎时(实际上)实现者遵循的规则.它无法提供有关您关注的实现的特定信息,即主要浏览器.特别是有几本书可以为您提供有关主要浏览器中的javascript实现如何表现的非常直接的信息.为了说明不同之处,我将在下面列出ECMAScript规范和Javascript一书的摘录.我觉得你'
这是来自ECMAScript语言规范:
10.2 输入执行上下文
即使函数以递归方式调用自身,每个函数和构造函数调用都会进入一个新的执行上下文.每个返回都退出执行上下文.抛出的异常(如果未捕获)也可能退出一个或多个执行上下文.
当控件进入执行上下文时,将创建并初始化作用域链,执行变量实例化,并确定此值.
范围链的初始化,变量实例化以及此值的确定取决于输入的代码类型.
这是来自O'Reilly的Javascript:The Definitive Guide(第5版):
8.8.1词汇范围
JavaScript中的函数是词法上而不是动态作用域.这意味着它们在定义它们的范围内运行,而不是它们的执行范围.定义函数时,将保存当前作用域链,并成为函数内部状态的一部分....
道格拉斯·克罗克福德(Douglas Crockford)的书强烈推荐用于解决这些问题:
JavaScript,The Good Parts http://oreilly.com/catalog/covers/9780596517748_cat.gif
Javascript,The Good Parts,也来自O'Reilly.