即使这些JavaScript片段都遇到错误,为什么它们的行为也有所不同? [英] Why do these snippets of JavaScript behave differently even though they both encounter an error?
本文介绍了即使这些JavaScript片段都遇到错误,为什么它们的行为也有所不同?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
var a = {}
var b = {}
try{
a.x.y = b.e = 1 // Uncaught TypeError: Cannot set property 'y' of undefined
} catch(err) {
console.error(err);
}
console.log(b.e) // 1
var a = {}
var b = {}
try {
a.x.y.z = b.e = 1 // Uncaught TypeError: Cannot read property 'y' of undefined
} catch(err) {
console.error(err);
}
console.log(b.e) // undefined
推荐答案
实际上,如果正确阅读了错误消息,则情况1和情况2会引发不同的错误.
Actually, if you read the error message properly, case 1 and case 2 throw different errors.
案例a.x.y
:
无法设置未定义的属性"y"
Cannot set property 'y' of undefined
案例a.x.y.z
:
无法读取未定义的属性"y"
Cannot read property 'y' of undefined
我认为最好通过简单的英语逐步执行来描述它.
I guess it's best to describe it by step-by-step execution in easy English.
案例1
// 1. Declare variable `a`
// 2. Define variable `a` as {}
var a = {}
// 1. Declare variable `b`
// 2. Define variable `b` as {}
var b = {}
try {
/**
* 1. Read `a`, gets {}
* 2. Read `a.x`, gets undefined
* 3. Read `b`, gets {}
* 4. Set `b.z` to 1, returns 1
* 5. Set `a.x.y` to return value of `b.z = 1`
* 6. Throws "Cannot **set** property 'y' of undefined"
*/
a.x.y = b.z = 1
} catch(e){
console.error(e.message)
} finally {
console.log(b.z)
}
案例2
// 1. Declare variable `a`
// 2. Define variable `a` as {}
var a = {}
// 1. Declare variable `b`
// 2. Define variable `b` as {}
var b = {}
try {
/**
* 1. Read `a`, gets {}
* 2. Read `a.x`, gets undefined
* 3. Read `a.x.y`, throws "Cannot **read** property 'y' of undefined".
*/
a.x.y.z = b.z = 1
} catch(e){
console.error(e.message)
} finally {
console.log(b.z)
}
在评论中, Solomon Tam 找到了 查看全文