Фигурные скобки имеют четыре семантические функции в JS.
Семантика 1, организуйте сложные предложения, это наиболее распространенный вариант.
Скопируйте код кода следующим образом:
если (условие) {
//...
}еще {
//...
}
для() {
//...
}
Семантика 2, объявление литерала объекта
Скопируйте код кода следующим образом:
вар объект = {
имя: 'Джек',
возраст: 23
};
Все это представляет собой оператор присваивания, в котором {name:'jack',age:23} является выражением.
Семантика 3, объявить функцию или функциональный литерал
Скопируйте код кода следующим образом:
функция f1(){
//...
}
вар f2 = функция(){
//...
}
Разница между f1 и не-f2 заключается в том, что первый находится в периоде интерпретации синтаксиса, а второй — во время выполнения. Разница в том, что если код, вызывающий функцию, находится после определения функции, разницы нет; если код, вызывающий функцию, находится до определения функции, f1 все равно можно вызвать, но f2 сообщит об ошибке, сообщив об этом. f2 не определен.
Семантика 4, синтаксическая запись для структурированной обработки исключений.
Скопируйте код кода следующим образом:
пытаться {
//...
}поймать(бывший){
//...
}окончательно{
//...
}
Здесь есть разница между фигурными скобками и оператором сопоставления (семантика 1). Если в фигурных скобках находится только один оператор, фигурные скобки можно опустить в if/else/for и т. д., но нельзя использовать try/catch/finally. опущен.
Я долгое время боролся со следующим кодом
Скопируйте код кода следующим образом:
function(){}() //Анонимная функция выполняется немедленно, периодический отчет синтаксического анализа
{}.constructor //Получаем конструктор литерала объекта, и во время синтаксического анализа будет сообщено об ошибке
Что вызывает недоумение, так это то, почему [].constructor написан так, но не сообщает об ошибке. Один из них — это конструктор, который хочет получить прямое значение объекта, а другой — просто конструктор, который хочет получить прямое значение объекта. массив.
Конечно, добавление переменной для получения не приведет к ошибке.
вар c = {}.constructor;
Такая же ситуация, как
var fn = function(){}() не сообщит об ошибке.
На самом деле проблемы вызывает именно «приоритет операторов» js, то есть {} понимается как составной блок операторов (семантика 1), а не семантика литерала объекта (семантика 2) или объявленной функции ( семантический 3).
function(){}(), фигурные скобки понимаются как составные операторы. Естественно, синтаксис предыдущей функции объявления function() является неполным, что приводит к ошибке при анализе синтаксиса.
{}.constructor, фигурные скобки понимаются как составные операторы, а за фигурными скобками следует оператор точки. Если перед оператором точки нет разумного объекта, естественно будет сообщено об ошибке.
Исправление известно: добавьте оператор приведения ()
(function(){})(), (function(){});//Принудительно понимать как функцию (семантика 3), «функция()» означает выполнение функции, то есть она выполняется немедленно после декларации.
({}).constructor //({}) заставляет фигурные скобки восприниматься как литералы объекта (семантика 2) означает получение членов объекта. Естественно, последующий оператор точки может быть выполнен обычным образом. .