Javascript函数范围

Posted

技术标签:

【中文标题】Javascript函数范围【英文标题】:Javascript function scope 【发布时间】:2011-11-15 01:30:15 【问题描述】:

为什么在下面的示例中,警报会打印 2? var a 对函数 n 未知...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

    <title>Test Doc</title>
    <script type="text/javascript">
        var a = 1;
        function f() 
            var a = 2;
            function n() 
                alert(a);
            
            n();
        
        f();
    </script>
</head>

<body>


</body>
</html>

【问题讨论】:

"var a is unknown to function n..."php 中就是这种情况。幸运的是 JavaScript 不是 PHP。 【参考方案1】:

JavaScript 函数继承其父级的作用域。内部变量会影响同名的父作用域变量。

Further Reading.

【讨论】:

+1 定位和良好的链接。 @user443946,在该文档中搜索“嵌套函数和闭包”。【参考方案2】:

a 被贴花为全局变量并赋值为 1。a 也在函数 f() 内声明并赋值为 2。函数 n() 在函数 f() 内声明并在分配给“内部”a 后调用。

所以当n被调用时,标识符a将从n的范围内解析出来。作用域链上第一个具有a 属性的变量对象是f 中声明的变量对象,因此返回它的值。

【讨论】:

【参考方案3】:

它会提醒“2”。

在此处测试您的 javascript 示例:jsfiddle.net

你的例子贴在这里:your javascript example

为什么 var a 不知道 n() ??

【讨论】:

以上是关于Javascript函数范围的主要内容,如果未能解决你的问题,请参考以下文章

Javascript,回调函数中的变量范围之外?

Javascript函数范围

Javascript 范围规则和 mongo map/reduce 函数

javascript函数声明和范围差异[重复]

Javascript中的范围链和在全局范围内调用嵌套函数

Javascript - 将对象属性转换为函数范围内的变量