【发布时间】:2017-12-14 02:42:52
【问题描述】:
这种行为很奇怪。我有一个看起来像这样的对象数组:
myObjects = [
{
name: 'List 1',
invitations: [
{ email: 'ralph@ralph.com', stamp: '1234' },
{ email: 'mike@mike.com', stamp: '4576' }
]
},
{
name: 'List 2',
invitations: [
{ email: 'steve@steve.com', stamp: '5678' },
{ email: 'bob@bob.com', stamp: '6789' }
]
},
]
我需要过滤邀请数组包含某个电子邮件地址的对象,所以我正在这样做,当我在 Sublime Text 中测试它时效果很好:
filteredObjects = myObjects.filter(obj => {
for (invitation of obj.invitations) {
if (invitation.email == 'bob@bob.com') return true;
}
});
// [ { name: 'List 2', invitations: [ [Object], [Object] ] } ]
但是,如果我尝试在 Chrome 中运行它,它会让我出于某种原因在 for 循环中声明变量(注意 for 循环中添加的“var”):
filteredObjects = myObjects.filter(obj => {
for (var invitation of obj.invitations) {
if (invitation.email == 'bob@bob.com') return true;
}
});
如果我不声明变量(使用“var”),我的 Chrome 控制台中会出现错误:
Uncaught (in promise) ReferenceError: invitation is not defined
我想了解为什么会发生这种情况,以及是否有更好的方法来编写我的过滤器。
【问题讨论】:
-
如果不声明
invitation,它指的是什么? -
你在某处有使用严格吗?
-
你是在问全局范围内是否还有另一个同名的变量?没有,我尝试了一些随机变量名称以确保它不是冲突问题。
-
@Alan:如果
use strict生效,变量必须在使用前用var(或let,或const)声明。for (let invitation of obj.invitations) {将为您提供最小范围的名称。 -
不管是什么原因造成的,在使用变量之前,您应该始终使用
let或var声明变量。从错误消息中我猜你是通过一个缩小器/丑化器传递你的代码。
标签: javascript node.js google-chrome vue.js