我发现了一些看似奇怪的JavaScript行为,并且想知道是否有特定原因:
函数调用cb.setAttribute('checked', true);
将引发错误,但也会记录null(console.log('test'))
。不应该在明确可以调用该函数之后才对这个表达式求值吗?
我认为可能是参数部分中的表达式在函数名称之前求值的情况。但是像test
这样的函数调用确实会先记录(console.log(1))(console.log(2))
,然后记录1
。
答案 0 :(得分:2)
通常,在动态语言中,确定对象是否可调用的方法是调用它。而且,在对参数进行评估之前,您不能这样做。
当然,对于像null
这样的关键字,它是不可调用的,可以提前知道,但这是一种不寻常的情况。在大多数情况下,您正在加载一个可能调用或可能无法调用的变量;特殊情况下,解释器检查调用非可调用常量的尝试的情况是毫无意义的,因为它不应在惯用代码中发生,并且无法处理以下简单情况:
var foo = null;
foo(console.log(1));
唯一的其他解决方案是在评估可能调用的那一刻预检查可调用性,但这只是添加了额外的检查,这会减慢解释器的速度,减慢所有代码的速度,只有在病理学中才能实现的微小好处代码。