【问题标题】:JavaScript function parameter and scopeJavaScript 函数参数和作用域
【发布时间】:2015-06-10 06:38:23
【问题描述】:

我用下面列出的代码做了一些测试:

function foo(x) {
    alert(y);
}
var y = 'I am defined outside foo definition';
foo();

上面的代码给了我一个警告'我是在 foo 定义之外定义的'。

然后进行另一个测试:

function bar(x) {
    alert(x);
}
var x = 'I am defined outside foo definition';
bar();

function bar(x) {
    alert(x);
}
x = 'I am defined outside bar definition';
bar();

以上两个代码都给了我一个“未定义”的警报。

那为什么?

【问题讨论】:

  • 你有什么问题?

标签: javascript function scope


【解决方案1】:

因为在这两种情况下,您在函数 bar 中都有一个局部范围变量(第一个参数),您没有向其传递任何值。由于存在局部范围变量,因此不会检查全局范围以查看是否存在此类变量。

在这种情况下,您需要在调用bar 时将值传递给参数

function bar(x) {alert(x);}
x = 'I am defined outside foo definition';
bar(x);

在第一种情况下,当您在 bar 中使用 y 时,在 bar 中没有名为 y 的局部范围变量,因此它会查看父范围以查看是否存在这样的变量访问值就是它的工作方式

【讨论】:

    【解决方案2】:

    这是因为当你声明参数x时

    function bar(x) { /*...*/ }
    

    您正在“隐藏”全局变量 x。您只能访问参数 x

    尝试传入全局 x

    function bar(x) { alert(x); }
    var x = 'I am defined outside bar definition';
    bar(x); // here the x is the global x that we pass in
            // the function gets a reference to the global x
    

    如果我们省略参数,那么全局 x 将再次可见

    function baz() { alert(x); }
    var x = 'global var';
    baz(); // 'global var'
    

    请注意,在好的 js 应用程序中应该限制全局变量。

    【讨论】:

      【解决方案3】:

      如果你定义:

      var y = 'I am defined outside foo definition';
      

      它将是一个全局窗口变量(如果您在浏览器中使用 js),可以通过调用“全局”访问它:

      window.y
      

      如果你在函数中使用它,比如:

      function foo(x) {alert(y);}
      

      它仍然会引用一个全局变量,因为它不受函数参数的影响。

      如果你定义一个函数为:

        function foo(y) {alert(y);}
      

      然后y 被函数参数(顺便说一句,arguments[0] 的别名)遮蔽。这意味着此函数内对变量y 的所有引用都将引用参数变量,而不是全局变量。比如:

      var y = 'I am defined outside foo definition';
      function foo(y) { y = 'something';}
      alert(y);
      

      将显示我在 foo 定义之外定义

      编辑: 如果你有一个函数:

      function bar(x) {
          alert(x);
      }
      

      然后您尝试使用bar() 调用它,然后函数参数参数x 阴影全局变量x。 JS 引擎将查找局部变量 x,但找不到 - 这意味着您将在警报中收到 undefined 消息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-22
        • 2011-12-15
        • 2011-12-11
        • 1970-01-01
        • 2015-08-22
        • 1970-01-01
        • 2011-03-11
        • 2015-04-19
        相关资源
        最近更新 更多