当前位置:  开发笔记 > 编程语言 > 正文

Javascript/ECMAScript中函数的范围是什么?

如何解决《Javascript/ECMAScript中函数的范围是什么?》经验,为你挑选了1个好方法。

今天我与同事讨论了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页没有说明,是函数声明语句创建的函数对象要绑定到哪个对象.我错过了什么吗?



1> keparo..:

这是静态范围.函数中的语句在该函数中作用域.

然而,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.


完全正确 - 广泛地说`function a(){}`相当于`var a = function(){}`(有一些小的语义差异,但没有太大意义).
推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有