看上图的结果。第一个测试表示代码块。a:1可以理解为js保留的goto写法。
所以看到的不加括号的,都是被解释为了代码块。
加上个括号就被解释为了对象。
按照我的理解。
为表达式加上括号代表立即执行。
为语句加上括号 仅代表分组操作符。
初步理解 代码块是无法加括号的,所以此处自动解释为了对象?
以上的结论与我一直以来的理解所违背。
看上图的结果。第一个测试表示代码块。a:1可以理解为js保留的goto写法。
所以看到的不加括号的,都是被解释为了代码块。
加上个括号就被解释为了对象。
按照我的理解。
为表达式加上括号代表立即执行。
为语句加上括号 仅代表分组操作符。
初步理解 代码块是无法加括号的,所以此处自动解释为了对象?
以上的结论与我一直以来的理解所违背。
所有的括号里的内容都是表达式. 加个括号是为了将这个代码段变成表达式, 或者提高运算符优先级. 并不是你说的什么立即执行.
一定要回避一个问题: 靠自己的瞎想去钻一些牛角尖.
直接用{}会被解释为代码块而不是对象, 这个是javascript这个语言本身决定的特性,
解释器就是这么设计的, 你再往下深究又有什么意义?
我现在就记住一个: 直接写{}会被解释为代码块, 所以要加个括号.
那你现在就算再花二十个小时研究这个问题, 能比我好多少? 相信我, 有的东西是需要沉淀才能看懂的, 你的代码量不到哪里, 没遇到过那种场景, 无论你怎么研究都是扯淡!
我把这二十个小时拿来写代码, 能写好多了呢.
JavaScript 中以{
开头,会存在二义性。即,它有可能是一个 对象直接量,也可能是一个 语句块。
为了解决这个问题,ECMA 的方法十分简单粗暴:在语法解析的时候,如果一个语句以
{
开头,就只把它解释成语句块。
只要知道这一点就够了,业务场景中基本不会出现这种情况 立即执行函数时注意下就行=-=
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
其实问题是在于{}的语法二意性。
你在控制台里输入
{a:1}[1]
的时候,{}
并不是对象字面量的语法,而是block,类似于这种如果{}前面没有其他符号,就会被当成block语法,代表开一个新的作用域。
你的
{a:1,}[]
代码被解析成这样:很明显语法错误。