所有javascript大师:为什么会发生这种情况?

所有javascript大师:为什么会发生这种情况?,javascript,closures,Javascript,Closures,为什么该代码: function answer(x) { function closure() { var x = x || 42; console.log(x); } closure(); } foo(); 是否始终打印42 逻辑是像foo(31337)这样的东西将打印31337,因为在closure中x将是31337,因此x | 42将计算为31337。但事实并非如此 我就是搞不懂这一点,所以我在这里发布这篇文章,希望从一位真正的javascript大师那里得到

为什么该代码:

function answer(x) {
  function closure() {
    var x = x || 42;
    console.log(x);
  }
  closure();
}
foo();
是否始终打印
42

逻辑是像
foo(31337)
这样的东西将打印
31337
,因为在
closure
x
将是
31337
,因此
x | 42
将计算为
31337
。但事实并非如此

我就是搞不懂这一点,所以我在这里发布这篇文章,希望从一位真正的javascript大师那里得到启示

function answer(x) {
  function closure() {
    var x = x || 42;
    console.log(x);
  }
  closure();
}
answer(20);
在闭包内部,将
x
定义为局部变量。这意味着它会将参数
x
从链上方的应答函数中隐藏起来。由于您使用var语句声明了
x
,因此默认为
undefined

然后
x | | 42
undefined | | 42
,它是42

这里的问题是,您使用的是相同的名称。如果你做了
x=x | | | 42
,那么将x设置为28的就是
x=28 | | 42

区别在于使用
var
语句创建一个名为x的新函数局部变量。一旦这样做了,就没有办法引用范围链上更高的同名变量

阐明口译员的工作原理。大概是这样的:

function() {
    var x = 52;
    foo();
    function foo() {
        ...
    }
}
转换成

function() {
    function foo() {

    }
    var x;
    x = 52;
    foo();
}
在闭包内部,将
x
定义为局部变量。这意味着它会将参数
x
从链上方的应答函数中隐藏起来。由于您使用var语句声明了
x
,因此默认为
undefined

然后
x | | 42
undefined | | 42
,它是42

这里的问题是,您使用的是相同的名称。如果你做了
x=x | | | 42
,那么将x设置为28的就是
x=28 | | 42

区别在于使用
var
语句创建一个名为x的新函数局部变量。一旦这样做了,就没有办法引用范围链上更高的同名变量

阐明口译员的工作原理。大概是这样的:

function() {
    var x = 52;
    foo();
    function foo() {
        ...
    }
}
转换成

function() {
    function foo() {

    }
    var x;
    x = 52;
    foo();
}

var x
in
var x=x | | 42隐藏参数。
由于
var…
总是在函数的开头进行解析,即在执行赋值之前,外部x在函数中永远不可用

这里有一个更好的例子:

(function(x) {
    (function() {
        alert(x);
        var x = 'inside';
    })();
})(123);
执行顺序基本上是:

  • 使用值
    未定义定义定义var
    x
  • 执行
    警报(x)
  • 'inside'
    分配给
    x

    • var x
      var x=x | | 42隐藏参数。
      由于
      var…
      总是在函数的开头进行解析,即在执行赋值之前,外部x在函数中永远不可用

      这里有一个更好的例子:

      (function(x) {
          (function() {
              alert(x);
              var x = 'inside';
          })();
      })(123);
      
      执行顺序基本上是:

      • 使用值
        未定义定义定义var
        x
      • 执行
        警报(x)
      • 'inside'
        分配给
        x

      所以你说
      var x=x | | 42
      var x相同;x=x | | 42
      ,这意味着在执行
      (…)
      之前,将
      var x=(…)
      x
      声明为局部变量。为了澄清所有
      var
      语句,将其提升到范围的顶部。参见edit.so你说
      var x=x | | 42
      var x相同;x=x | | 42
      ,这意味着在执行
      (…)
      之前,将
      var x=(…)
      x
      声明为局部变量。为了澄清所有
      var
      语句,将其提升到范围的顶部。请参见编辑。