JavaScript函数

5
有这样的 JavaScript 代码:
function a() { 
  a = 3; 
  return a;
}
console.log(a());
console.log(a());

执行后它会打印出:3,类型错误。请问有人能解释一下为什么吗?
2个回答

11

你有作用域问题

因为你没有使用"var",你正在用一个数字(3)覆盖全局的"a"变量(曾经是你的函数)。

当你尝试第二次执行它时,它不再是一个函数而是一个数字,这就会抛出类型错误。

function a() {
  a = 3; // you just over-wrote a() 
  return a;
}

console.log(a()); // 3, but now "a" === number, not function
console.log(a()); // ERROR, you treated "a" as a function, but it's a number

你想要什么

function a() {
  var a = 3; // using var makes "a" local, and does not override your global a()
  return a;
}

console.log(a()); // 3
console.log(a()); // 3

在函数中几乎总是推荐使用var,否则就会污染或更糟地覆盖全局变量。 在JS中,使用var可以将变量强制转换为局部作用域(函数内)。

请注意,在全局范围内使用var仍然会创建一个全局变量。


2
我强烈推荐You Don't Know Js系列中的这本书。链接在此:https://github.com/getify/You-Dont-Know-JS/tree/master/scope%20%26%20closures - Lionel T
好的链接!@LionelDamiánT 是对的。我一直在谈论“作用域”,但实际上没有提到它。OP中的根本问题与作用域有关。在答案中更清晰地表达了这一点。 - Sebastien Daniel

0
如果您想将 a 设置为变量,则需要在前面加上 var。因为您没有这样做,它会暴露到全局作用域中,其中它是 window 对象的一部分,并且您可以使用 window.a 访问它。所以,最好的做法是将函数的第一行修改为: var a = 3

谢谢你们的解释,这是一个在线问题示例中的测试问题,由一家公司提出。 - OLe TKACH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接