📜  (函数() { var a = b = 5; })();控制台.log(b); - Javascript(1)

📅  最后修改于: 2023-12-03 14:58:59.967000             🧑  作者: Mango

神秘程序:(函数() { var a = b = 5; })();

这段代码看起来有些神秘并且让人困惑,它是一个自执行的匿名函数。在这个函数中,b 被赋值为 5,而 a 只存在于函数内部。

变量作用域

在这段代码中定义的变量 a 和 b,只存在于函数内部。因为它们是使用 var 关键字定义的,所以它们的作用域只限于函数内部,无法在全局作用域中访问。

当我们在控制台中尝试访问 b 的值时,会发现它的值为 5。但是当我们尝试访问 a 时,会发现它只存在于函数内部无法访问。

console.log(b); // 输出 5
console.log(a); // 报错:Uncaught ReferenceError: a is not defined
变量提升

使用 var 关键字定义的变量在函数体的任何位置都是可访问的,这是因为 JavaScript 的“变量提升”机制。

当声明变量时,会在代码执行之前将其提升到作用域的顶部。这些变量在声明之前也可以被访问(但值为 undefined)。

因此,我们可以将变量定义移到函数的顶部,而不是在函数内部使用 var 关键字分别定义:

(function() {
  var a;
  b = 5;
  a = b;
})();

console.log(b); // 输出 5
console.log(a); // 报错:Uncaught ReferenceError: a is not defined

在这个例子中,a 的声明被提升到了函数的顶部,然后 b 被赋值为 5,并最终将其赋值给 a。

建议

虽然这种变量定义方式有效,但并不推荐使用。这是因为它容易造成混乱以及难以维护。因此我们应该尽可能地在我们的代码中明确变量的作用域,以避免不必要的问题。