Javascript indexeddb:在请求过程中更改变量名如何导致错误?
我正在学习indexeddb,在比较下面的两个函数时,我感到困惑。它们完全相同,只是我将代码2的最后一个Javascript indexeddb:在请求过程中更改变量名如何导致错误?,javascript,indexeddb,Javascript,Indexeddb,我正在学习indexeddb,在比较下面的两个函数时,我感到困惑。它们完全相同,只是我将代码2的最后一个请求变量名更改为变量request2名称。这导致它们产生不同的结果 代码#1 产出: errors vs 代码#2 输出 //does expected behavior 代码#1使用console.log(request.result)时出现错误。我尝试使用chrome devtools调试器,发现调试器从未进入var request=store.put(entry),这让我更加困惑 代
请求
变量名更改为变量request2
名称。这导致它们产生不同的结果
代码#1
产出:
errors
vs
代码#2
输出
//does expected behavior
代码#1使用console.log(request.result)
时出现错误。我尝试使用chrome devtools调试器,发现调试器从未进入var request=store.put(entry)
,这让我更加困惑
代码#1错误,因为请求未定义。从概念上讲,我不明白以后重新定义
请求会如何改变任何事情。感谢您的帮助。有趣的是,我认为这与javascript中的“提升”有关
基本上,提升意味着代码中的变量声明被“带到了代码的顶端”。在声明和初始化变量的情况下,正如您对var request=store.put(entry)
所做的那样,声明(var request;)被提升到顶部,而不是初始化(实际分配store.put的结果)
因此,当运行代码时#1实际上如下所示:
request.onsuccess = event => {
var request; //this is the "hoisting" I am referring to
console.log(request.result) //this is currently undefined now!
let entry = request.result;
entry.title = 'mdn way'
request = store.put(entry) //this is the assignment
request.onsuccess = event => {
console.log('putting')
}
}
这有点让人困惑,但在这里有很好的解释(),特别是关于提升声明而不是初始化的部分(参见链接中的示例2)
当您将名称更改为request2时,它同样会被提升,但不会覆盖外部请求,因此request.result不是未定义的
这有意义吗?有趣的是,我认为这与javascript中的“提升”有关
基本上,提升意味着代码中的变量声明被“带到了代码的顶端”。在声明和初始化变量的情况下,正如您对var request=store.put(entry)
所做的那样,声明(var request;)被提升到顶部,而不是初始化(实际分配store.put的结果)
因此,当运行代码时#1实际上如下所示:
request.onsuccess = event => {
var request; //this is the "hoisting" I am referring to
console.log(request.result) //this is currently undefined now!
let entry = request.result;
entry.title = 'mdn way'
request = store.put(entry) //this is the assignment
request.onsuccess = event => {
console.log('putting')
}
}
这有点让人困惑,但在这里有很好的解释(),特别是关于提升声明而不是初始化的部分(参见链接中的示例2)
当您将名称更改为request2时,它同样会被提升,但不会覆盖外部请求,因此request.result不是未定义的
这有意义吗?仔细阅读var
、let
和const
。你在开玩笑,我现在意识到,第二次var请求
是不必要的。我刚刚删除了request
的第二个var
,它成功了。然而,我仍然不明白第二个var请求
将如何影响在它之前发生的代码,特别是当调试器甚至没有到达它时。我目前的理解是,var
在功能范围内let
是块作用域,并且const
除非它是对象,否则不能更改它。编辑:@sheun帮助,这很有意义。请仔细阅读var
、let
和const
。你在开玩笑,我现在意识到第二次var请求
是不必要的。我刚刚删除了request
的第二个var
,它成功了。然而,我仍然不明白第二个var请求
将如何影响在它之前发生的代码,特别是当调试器甚至没有到达它时。我目前的理解是,var
在功能范围内let
是块作用域,并且const
除非它是对象,否则不能更改它。编辑:@sheun帮忙了,这很有道理。
request.onsuccess = event => {
var request; //this is the "hoisting" I am referring to
console.log(request.result) //this is currently undefined now!
let entry = request.result;
entry.title = 'mdn way'
request = store.put(entry) //this is the assignment
request.onsuccess = event => {
console.log('putting')
}
}