Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript indexeddb:在请求过程中更改变量名如何导致错误?_Javascript_Indexeddb - Fatal编程技术网

Javascript indexeddb:在请求过程中更改变量名如何导致错误?

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),这让我更加困惑 代

我正在学习indexeddb,在比较下面的两个函数时,我感到困惑。它们完全相同,只是我将代码2的最后一个
请求
变量名更改为变量
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')
        }
    }