首页 > 解决方案 > 为什么我们不在javascript的函数参数中使用像“let”、“var”和“const”这样的关键字?

问题描述

function myFunction(let name){
    console.log("hello "+name);
}

myFunction("adi");

上面的代码会产生错误。为什么?

标签: javascriptvariables

解决方案


这是语言的工作方式,以及它的语法是如何定义的。不过,这一定是有原因的。

我可以对此进行一点推理并分享我的理由。

JavaScript 中有两种作用域类型,

  1. 功能范围,
  2. 块范围

var定义具有函数范围的变量,而let定义const块范围变量。

函数参数在函数范围内,这是有道理的,至少在语言的当前思维方式下是有意义的,因为将参数传递给函数以在块的范围内是没有意义的。这会引起关于参数所属范围的模糊性的问题,这可以通过使用另一种语法来以某种方式标记参数和块来克服。使用另一种可能甚至有用的语言设计思维方式。但是,该语言的当前状态并非如此,它本身是有意义的。

历史上也只有var. let并且const晚于var,因此语言中只有函数作用域,因此参数必须在全局作用域或函数作用域中,并且它被设计为在函数作用域中,这在类似 ALGOL 的语言。何时let出现const它们出现的一个原因是具有块级范围而不是功能块,例如if条件for等。因此它们没有应用于函数参数,这通常在它们的函数中都可见时更有用。

只是为了澄清我对替代宇宙或平行宇宙 JavaScript 中假设的替代作用域的含义,我想构建一个示例,其中还有另一个问题需要回答:

function f(x:a, x:b, y:b) { // parameters' scope labeling syntax
    scope a: if(x > 1 && !y) return x + 1; // block's scope labeling syntax
    scope b: return x * y;

}

f(3:a, 9:b, 0:b) // returns 4
f(3:a, 9:b, 1:b) // returns 27

推荐阅读