为什么即使无法调用该函数也要评估函数调用的参数部分中的表达式?

时间:2018-08-01 01:47:25

标签: javascript

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

函数调用cb.setAttribute('checked', true); 将引发错误,但也会记录null(console.log('test'))。不应该在明确可以调用该函数之后才对这个表达式求值吗?

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

1 个答案:

答案 0 :(得分:2)

通常,在动态语言中,确定对象是否可调用的方法是调用它。而且,在对参数进行评估之前,您不能这样做。

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

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

唯一的其他解决方案是在评估可能调用的那一刻预检查可调用性,但这只是添加了额外的检查,这会减慢解释器的速度,减慢所有代码的速度,只有在病理学中才能实现的微小好处代码。