• 已删除用户
童话的爱
童话的爱
发布于 2022-03-13 / 413 阅读 / 0 评论 / 0 点赞

[JavaScript] 几个能令你瞬间血压升高的bug

1. javascript 的弱类型

当你从一个对象中取出键值对时,要注意,即使是完全只有数字的key,你有时可能仍需要将数值类型转为字符串类型以使switch 中的case 此类的匹配语句正确匹配值:

// 定义一组对象
var obj = { 1: {...}, 2: {...} }
// 获取指定对象的所有键
var keys = Object.keys(obj)
// 循环出所有键
keys.forEach(key => {
  // 匹配键
  switch (key) {
    case 1: 
	// 这个语句块不会被执行
	console.log("case 1 invoked.")
	break
    case "1":
	// 该语句才会执行
	console.log("case '1' invoked.")
	break
  }
})

2. this 定义域问题

有时你可能需要这样:在一个函数中调用另一个函数,有时甚至是在匿名函数中调用另一个你定义的函数,由于javascript 自身语言特性,当你在类似匿名函数中调用this.xxx 时,代码很可能不会如预期一样运行,它会出错甚至不会告诉你为什么,而你只能对着一片undefined 的控制台绞尽脑汁地翻找代码中的逻辑错误。

axiosGet("https://127.0.0.1/xxx").then(function (response) {
    ...
    this.someFunction()  // undefined 或者得到一个error 错误
    ...
})
...
someFunction() {
    ....
}

实际上这个错误是因为this 的作用域造成的。有时你在一个函数的内部调用另一个函数时,由于你所在的函数的上下文并不和你想调的那个函数所在的上下文一样,因此就出现了各种奇奇怪怪的问题。要解决它比较简单,在你要调用另一函数的地方的外面(比如外层定义域)定义一个var that = this,来让正确的this 指向保存为一个变量,之后再在函数内部使用that.someFunction() 来调用目标函数,或许能凑效😜

持续更新中....

评论