错误类型和严格模式

错误类型

JavaScript 中,有多种错误类型,每种类型代表了不同种类的运行时错误。

  • Error: 所有错误的基类
  • SyntaxError:语法错误,通常在代码解析阶段就会被捕获。
  • ReferenceError:引用错误,当试图访问未声明的变量或函数时抛出。例如,在变量未声明时尝试使用该变量。
  • TypeError类型错误,当对一个值使用不适当的操作或方法时抛出。例如,调用非函数值、对 null 或 undefined 使用对象的方法等。
  • RangeError:范围错误,当传递给函数参数的值不符合规范时抛出
  • URIError:URI 错误,当使用全局函数 decodeURI()decodeURIComponent()encodeURI()encodeURIComponent() 时传递了无效的参数时抛出。
  • EvalError:由于 eval() 函数执行时出现的错误而抛出。在现代 JavaScript 中,这个错误类型已经不太常见,因为 eval() 错误通常被表示为 SyntaxErrorTypeError
  1. Error: 通常使用try catch语句捕获,并抛出异常
try {
  throw new Error()
}catch(e) {
  console.log(e.message)
} finally {
  
}
  1. SyntaxError:语法错误,通常在代码解析阶段就会被捕获。
// 变量名不规范
var 1ab = 1;

// 关键字赋值
new = 5

// 基本的语法错误
var a = 5:
  1. ReferenceError:引用错误,当试图访问未声明的变量或函数时抛出。例如,在变量未声明时尝试使用该变量。
// 变量或者函数未声明
test()

// 给无法被赋值的对象赋值的时候, 赋值左侧是无效的
var a = 1 = 2;
  1. TypeError类型错误,当对一个值使用不适当的操作或方法时抛出。
// 调用不存在的方法
123()

var obj = {}
// obj.say, 认为是一个属性,对象的属性被执行了,所以报类型错误
obj.say() // TypeError, obj is not a function

// 实例化原始值
var a = new 'string'
var a = new 123

  1. RangeError:范围错误,当传递给函数参数的值不符合规范时抛出
 var arr = [1, 2, 3]
arr.length = -1
console.log(arr)

// 对象方法参数超出可行范围
var num = new Number(66.66)
// 参数范围在0-100
// console.log(num.toFixed(-1))
  1. URIError:URI 错误
// URI: 统一资源标识符
// URL: 统一资源定位符, http://www.baidu.com/news#today 
// URN: UNIFORM RESOURCE NAME 统一资源名称
// www.baidu.com/news#today, name特性

var url = 'http://www.baidu.com?name=张子枫'
// 地址编码
var newUrl = new encodeURI(url)
console.log(newUrl)
// 地址解码
var originUrl = decodeURI(newUrl)

var str = decodeURI('%dvdssww%') // 报错,URIError
  1. 由于 eval() 函数执行时出现的错误而抛出
// EvalError: eval函数执行错误: eval不建议使用,使用不规范,不容易调试,存在性能问题 容易引起XSS攻击
var obj = {
    name: 'zzf',
    age: 22
}
console.log(eval(obj))
console.log(eval('obj'))

严格模式

严格模式:在代码执行时强制执行更严格解析和错误处理的模式。

  • IE9及以下不支持严格模式

  • 严格模式下不能使用with表达式

  • 严格模式下不能使用caller/callee

  • 严格模式下变量必须声明才能使用

  • 严格模式下this默认指向undefined

  • 严格模式下,函数的参数不能重复

  • 在严格模式下,eval 中的代码会在自己的作用域中运行,不会影响到周围的作用域。

  1. 使用use strict可以开启严格模式,在IE9以下不支持严格模式
"use strict";

function test() {
"use strict";
}
  1. 严格模式下不能使用with表达式(用来改变作用域)
var a = 1;
var obj = {
 a: 2
}
function test() {
  var a = 3;
  // with可以改变作用域
  with(test) {
      console.log(a)
  }
}
test()
  1. 严格模式下不能使用caller/callee
function test() {
  console.log(arguments)
  console.log(arguments.callee) // 指向当前正在执行的函数本身的引用
}
test()


function test1() {
  test2()
}
test1()
function test2() {
  console.log(test2.caller) // 指向调用当前函数的调用者
}
  1. 严格模式下变量必须声明才能使用
a = 1; // 非严格模式下不报错
a = 1; // 严格模式下报错
  1. 严格模式下this默认指向undefined
function test() {
	console.log(this)
}
test() // 严格模式下, this指向undefined, 非严格模式下,this指向window
test.call(1) // 非严格模式下,this指向包装类 new Number(1), 严格模式下,this指向1
  1. 严格模式下,函数的参数不能重复
function test(a,a) {
	console.log(a)
}
test(1,2) // 2, 严格模式下报错


var obj = {
  a: 1,
  a: 2
}
console.log(obj.a) // 严格模式下也是2
  1. 在严格模式下,eval 中的代码会在自己的作用域中运行,不会影响到周围的作用域。
eval('var a = 1; console.log(a)') // eval有独立的作用域
consol.log(a)  // 严格模式下报错, 非严格模式下输出1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值