JavaScript中的作用域规则

JavaScript中的作用域规则,javascript,Javascript,我正在阅读《JavaScript:完整参考》一书,第三版作者:托马斯·鲍威尔;Fritz Schneider对这些概念有详细的理解 范围界定规则 在函数或对象之外,变量位于全局空间内,无论是否使用var显式定义。在函数或对象中,如果使用var语句,则定义的变量将是构造的局部变量;如果没有这份声明,它将是全球性的 通常,JavaScript开发人员对var的作用域规则做出的假设并不完全正确。例如,在For循环中找到的var语句不会将该值限定到循环中。在这种情况下,它的作用域是它所在的函数,或者是全

我正在阅读《JavaScript:完整参考》一书,第三版作者:托马斯·鲍威尔;Fritz Schneider对这些概念有详细的理解

范围界定规则 在函数或对象之外,变量位于全局空间内,无论是否使用var显式定义。在函数或对象中,如果使用var语句,则定义的变量将是构造的局部变量;如果没有这份声明,它将是全球性的

通常,JavaScript开发人员对var的作用域规则做出的假设并不完全正确。例如,在For循环中找到的var语句不会将该值限定到循环中。在这种情况下,它的作用域是它所在的函数,或者是全局空间(如果它在函数或对象之外)

为了观察结果,我这样编码

当我在EclipseIDE中按Ctrl+Space以显示JavaScript方案时,为什么我能够在函数外部访问变量jLocal

根据作者的描述:

例如,在For循环中找到的var语句不会将该值限定到循环中。在这种情况下,它的作用域是它所在的函数,或者是全局空间(如果它在函数或对象之外)


因为在代码的底部有:

...
jLocal = jLocal + j; // defined not in any functions
...

使其全局化,但不必定义。

因为在代码的底部有:

...
jLocal = jLocal + j; // defined not in any functions
...

使其全局化,但不必定义。

这不是局部函数的情况。myFunc是全局的,就像变量jLocal是名称一样。由于提升,jLocal被假定为在父范围的顶部声明

仔细看,有两个变量名为jLocal。一个是myFunc的局部函数,一个是全局范围的隐式函数

想要小费吗


严格使用;就在var global1=true;之前;。HTML5实现将能够捕获并显示您的错误。

这不是本地函数的情况。myFunc是全局的,就像变量jLocal是名称一样。由于提升,jLocal被假定为在父范围的顶部声明

仔细看,有两个变量名为jLocal。一个是myFunc的局部函数,一个是全局范围的隐式函数

想要小费吗


严格使用;就在var global1=true;之前;。HTML 5实现将能够捕获并显示您的错误。

@apsillers:程序不会生成jLocal=jLocal+j的输出;那么,为什么Eclipse在附加的屏幕截图中假定jLocal-Global。@apsillers:程序不会生成jLocal=jLocal+j的输出;那么,为什么Eclipse在附加的屏幕截图中假定jLocal-Global。jLocal是在第二个myFunc+1中定义的,当我在底部评论这两行时,Eclipse不建议这样做。@ShirgillAnsari是的,但它不是同一个jLocal,即使它有相同的名称。底部的那个是一个完全不同的变量,一个全局jLobal。虽然函数中的那一行是本地的。jLocal是在第二个myFunc+1中定义的,但当我注释底部的那两行时,Eclipse不建议使用它。@ShirgillAnsari是的,但它不是同一个jLocal,即使它有相同的名称。底部的那个是一个完全不同的变量,一个全局jLobal。而函数中的一个是本地的。