请考虑以下三种情况。
var y = 1;
if (function f(){}) {
y += typeof f;
}
console.log(y); // "1undefined"
上面的输出表明function f(){}
仅被检查其真实性,而在执行if block
之前未定义。{p>
var y = 1;
if (y--) {
y += typeof f;
}
console.log(y); // "0undefined"
但是,这里我们得到y的值为0,这意味着if condition
中的表达式在if block
之前执行。但是不应该跳过if block
,因为y--
的计算结果为0,这是一个假值,如下所示。
var y = 1;
if (0) {
y += typeof f;
}
console.log(y); // "1"
答案 0 :(得分:3)
上面的输出表明仅检查了函数f(){}的真实性,但未定义
一个命名函数表达式创建一个仅在其自己的作用域内共享其名称(在这种情况下为f
)的变量。
您从不创建f
变量,该变量位于您的y += typeof f;
语句可访问的范围内。
但是不应跳过if块,因为y--的值为0
y--
的值为0。
其计算结果为1
,然后然后将y
递减为0
。
答案 1 :(得分:2)
if (function f(){})
这并没有定义f
,因为它只是一个以命名的函数 expression 。表达式不会在本地范围内以名称f
声明函数,因此不会创建f
。
if (y--)
后减量运算符首先返回y
的值,然后然后将其减量。与递减运算符--y
进行比较。
这就是您得到行为的原因。与“是否执行”无关。