javascript - 为什么我们不在javascript的函数参数中使用像“let”、“var”和“const”这样的关键字?
问题描述
function myFunction(let name){
console.log("hello "+name);
}
myFunction("adi");
上面的代码会产生错误。为什么?
解决方案
这是语言的工作方式,以及它的语法是如何定义的。不过,这一定是有原因的。
我可以对此进行一点推理并分享我的理由。
JavaScript 中有两种作用域类型,
- 功能范围,
- 块范围
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
推荐阅读
- python - 如何通过多处理模块创建的工作进程在python中组合动态生成的测试套件
- laravel - 如何使表单中的动态字段得到验证和要求?
- nlp - spaCy:使用依赖解析在句子中查找根词的问题
- swift - Swift Realm 备份和恢复领域数据
- r - 总结变量随时间的发展
- android - ZXing 在导航页面的第一页上不起作用
- php - 如果没有什么不同,更新不起作用
- sql - 在 PL/SQL 中运行项目(多个 SQL)的正确方法
- c++ - consteval 函数返回具有非平凡 constexpr 析构函数的对象
- java - 以编程方式在Android中从顶部更改LinearLayout高度(默认从底部)(Java)