以下是我项目中较大的JavaScript对象的一部分。我删除了几千行代码来揭示有问题的部分...
下面的第6行是有问题的代码行。
JavaScript的简单示例
projectTaskModal = {
// Cache Properties
cache: {
$taskDueDateSpan: $('#task-modal-due-date-span'),
$taskDueDateVal: projectTaskModal.cache.$taskDueDateSpan.dataAttr('due-date'),
}
}
首先,我试过这个:
$taskDueDateVal: projectTaskModal.cache.$taskDueDateSpan.dataAttr('due-date'),
但是这导致了此控制台错误:Uncaught TypeError: Cannot read property 'cache' of undefined
接下来我也尝试了这个:
$taskDueDateVal: this.$taskDueDateSpan.dataAttr('due-date'),
但这也导致了此控制台错误:Uncaught TypeError: Cannot read property '$taskDueDateSpan' of undefined
正如您在第6行所见,我试图访问第5行的值
projectTaskModal.cache.$taskDueDateSpan
答案 0 :(得分:3)
您不能从对象文字本身内部引用“正在构建”对象。我们唯一要做的就是在最初构建对象后更新对象。
projectTaskModal = {
// Cache Properties
cache: {
$taskDueDateSpan: $('#task-modal-due-date-span')
}
};
projectTaskModal.cache.$taskDueDateVal = projectTaskModal.cache.$taskDueDateSpan.dataAttr('due-date');
或者,使用该jQuery表达式初始化另一个变量,并将其用于两个属性:
var $dueDateSpan = $('#task-modal-due-date-span');
projectTaskModal = {
// Cache Properties
cache: {
$taskDueDateSpan: $dueDateSpan,
$taskDueDateVal: $dueDateSpan.dataAttr('due-date')
}
}
答案 1 :(得分:1)
JS是一种严格而不是懒惰评估的语言。
这意味着语句中的表达式将在内部进行评估。
projectTaskModal = {
// Cache Properties
cache: {
$taskDueDateSpan: $('#task-modal-due-date-span'),
$taskDueDateVal: projectTaskModal.cache.$taskDueDateSpan.dataAttr('due-date'),
}
}
因此,在此语句中,首先评估正确的部分(对象文字),然后将对它的引用赋给变量projectTaskModal
。
这意味着在评估过程中projectTaskModal
的值为undefined
。