javascript - 为什么即使函数无法调用,函数调用的参数部分中的表达式也会被求值?

标签 javascript

我发现了一些看似奇怪的 JavaScript 行为,想知道是否有特定原因:

函数调用 null(console.log('test')) 将抛出错误,但也会记录 test。难道不应该只在明确可以调用该函数后才对这个表达式求值吗?

我认为可能是参数部分中的表达式在函数名之前被求值。但是像 (console.log(1))(console.log(2)) 这样的函数调用确实会先记录 1 然后 2

最佳答案

一般来说,在动态语言中,判断对象是否可调用的方法是调用它。在对参数进行评估之前,您不得这样做。

当然,对于像 null 这样的关键字,可以提前知道它不会被调用,但这是一种不寻常的情况;大多数时候,您加载的变量可能是可调用的,也可能是不可调用的;解释器检查调用不可调用常量的尝试的特殊情况是没有意义的,因为它不应该在惯用代码中发生,并且它不会处理像这样的简单情况:

var foo = null;
foo(console.log(1));

唯一的其他解决方案是在评估可调用性时预先检查可调用性,但这只是添加额外的检查来减慢解释器的速度,减慢所有代码的速度以获得只有在病态中才能实现的微小好处代码。

关于javascript - 为什么即使函数无法调用,函数调用的参数部分中的表达式也会被求值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51624293/

相关文章:

javascript - 删除按钮不起作用

javascript - 为什么 navigator.geolocation.getCurrentPosition 在 IE 11 上不起作用

javascript - 如何在 HTML 表单中抑制或转换弯引号等字符?

javascript - 如何正确定位点击的div?

javascript - 让我的 "beer"垂直进度条工作

javascript - React 和 Express 不起作用?

yyyy-mm-dd hh :mm:ss aa help 的 JavaScript 转换

javascript - Javascript 的正则表达式不正确

javascript - 错误 TS2339 : Property 'map' does not exist on type 'Observable<Response>'

javascript - HTML5 Canvas 动画不显示