>我声明了一个用作比较的函数。我的问题是:
为什么条件充当声明?
为什么 4 行有效,而 5 行不工作?
我知道这段代码是不现实且未使用的,但是为什么编译器允许这种语法?
谷歌上没有答案。但话又说回来,我可能没有找对地方。
var A = () => console.log(3);
if (A === console.log(1)) {
A();
};
A ? A() : null;
if (A === console.log(1567)) {};
if (B === console.log(1567)) {};
预期输出为:
3
输出为:
1
3
1567
未捕获的引用错误:B 未在 :11:1 处定义
一行一行的意思 -
- 第一行将
A
定义为箭头函数。 - 下一行比较 - 从右到左 -
A
已定义并具有一些值,接下来console.log(1)
是函数调用,因此"评估"了它的值。并将返回值与定义的A
值进行比较 - 结果证明是假的(A
是函数引用,而console.log()
返回undefined
(。 - 如果 - 偏移
A
被定义,因此它调用A()
- 因此第二行输出。 - 再次比较 - 类似于点(2(
- 再次比较 - 但没有定义
B
这是一个可抛出的,因此错误和从左到右 -console.log
永远不会被评估。
问题-
- 条件充当语句 - 这是设计使然 - 尝试
if(console.log())
- 它们是代码在评估为真/假时执行方向的地方。在该领域发表声明可提供以下功能 -while(true){}
或while(someFuncIfTrue(2)){}
.
第 - 4 步有效,但第 5 步无效 - point(5( 回答了这个问题。
表达式console.log(1)
的计算结果为undefined
。A
不是undefined
所以没有一个比较是真的。
但是,在返回undefined
之前,console.log(1)
1
打印到控制台。因此,示例中的第一行和第三行来自console.log(1)
和console.log(1567)
的评估。
console.log(1)
不是结束。关闭是()=>console.log
.