标识符已声明

Identifier has been declared

因为我是初学者,不知道那里发生了什么。你能 help/explain 告诉我发生了什么事吗?

它适用于除“位置”之外的所有属性,它表示:

property has been declared

'use strict';

const restaurant = {
  name: 'Classico Italiano',
  location: 'Via Angelo Tavanti 23, Firence, Italy',
  categories: ['Italian', 'Pizzeria', 'Vegetarian', 'Organic'],
  starterMenu: ['Focaccia', 'Bruschetta', 'Garlic Bread', 'Caprese Salad'],
  mainMenu: ['Pizza', 'Pasta', 'Risotto'],
  hello_kitty: function (two, three) {
    return [this.starterMenu[two], this.mainMenu[three]];
  },
};


const {location} = restaurant;
console.log(location);

如果您在浏览器的控制台中使用此代码,很自然会出现此错误,因为 location 是位置对象的保留名称,该对象包含有关当前页面的信息 URL。

参见:https://www.w3schools.com/jsref/obj_location.asp

如您的控制台所示:无法将 location 属性 分配给新变量,因为它 之前已声明

发生这种情况是因为您的 Javascript 运行 在一个环境(浏览器)中并且这个环境有一些变量和方法。

您可以通过以下方式查看:

console.log(window)

结果将是:

Window {0: global, window: Window, self: Window, document: document, name: '', location: Location, …}

如您所见,location 是存在于 window 对象中的预定义 属性,因此在 global scope 中声明新的 location 属性 是问题的原因。

如果您熟悉 Javascript 中的 scopes,您可以简单地将您的代码片段包装到一个函数中以使其正常工作:

'use strict';

function logLocation(){
   const restaurant = {
      name: 'Classico Italiano',
      location: 'Via Angelo Tavanti 23, Firence, Italy',
      categories: ['Italian', 'Pizzeria', 'Vegetarian', 'Organic'],
      starterMenu: ['Focaccia', 'Bruschetta', 'Garlic Bread', 'Caprese Salad'],
      mainMenu: ['Pizza', 'Pasta', 'Risotto'],
      hello_kitty: function (two, three) {
        return [this.starterMenu[two], this.mainMenu[three]];
      },
  };


  const {location} = restaurant;
  console.log(location);
}

logLocation()