持续更新,主要方便于存一些笔记。
闭包
function f1() {
var n = 999;
function f2() {
console.log(n);
}
return f2;
}
var result = f1();
result(); // 999
闭包就是函数f2,即能够读取其他函数内部变量的函数。由于在 JavaScript 语言中,只有函数内部的子函数才能读取内部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。闭包最大的特点,就是它可以“记住”诞生的环境,比如f2记住了它诞生的环境f1,所以从f2可以得到f1的内部变量。在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
(闭包的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中)
function Person(name) {var _age;
function setAge(n) {
_age = n;
}
function getAge() {
return _age;
}
return {
name: name,
getAge: getAge,
setAge: setAge
};
}
var p1 = Person('张三');
p1.setAge(25);
p1.getAge() // 25
闭包的另一个用处,是封装对象的私有属性和私有方法。
注意,外层函数每次运行,都会生成一个新的闭包,而这个闭包又会保留外层函数的内部变量,所以内存消耗很大。因此不能滥用闭包,否则会造成网页的性能问题。
数据类型转换
(自动转换)
'5' - '2' // 3
'5' * '2' // 10
true - 1 // 0
false - 1 // -1
'1' - 1 // 0
'5' * [] // 0
false / '5' // 0
'abc' - 1 // NaN
null + 1 // 1
undefined + 1 // NaN
注意:null转为数值时为0,而undefined转为数值时为NaN。
Js 遇到预期为数值的地方,就会将参数值自动转换为数值
'5' + 1 // '51'
'5' + true // "5true"
'5' + false // "5false"
'5' + {} // "5[object Object]"
'5' + [] // "5"
'5' + function (){} // "5function (){}"
'5' + undefined // "5undefined"
'5' + null // "5null"
Boolean函数可以将任意类型的值转为布尔值。它的转换规则相对简单:除了以下五个值的转换结果为false,其他的值全部为true。undefinednull-0或+0NaN''(空字符串)
Number()函数一般转为数值,除了混杂的,或者对象(数据,除了[5]当个数值),转为NaN
原生错误类型
var 1a;
// Uncaught SyntaxError: Invalid or unexpected token
SyntaxError对象是解析代码时发生的语法错误。
unknownVariable // Uncaught ReferenceError: unknownVariable is not defined
ReferenceError对象是引用一个不存在的变量时发生的错误。
// ReferenceError: Invalid left-hand side in assignment
另一种触发场景是,将一个值分配给无法分配的对象,比如对函数的运行结果或者this赋值。
RangeError对象是一个值超出有效范围时发生的错误
TypeError对象是变量或参数不是预期类型时发生的错误
URIError对象是 URI 相关函数的参数不正确时抛出的错误
除了 JavaScript 原生提供的七种错误对象,还可以定义自己的错误对象。
function UserError(message) {
this.message = message || '默认信息';
this.name = 'UserError'; }
UserError.prototype = new Error();
UserError.prototype.constructor = UserError;
上面代码自定义一个错误对象UserError,让它继承Error对象。然后,就可以生成这种自定义类型的错误了。
new UserError('这是自定义的错误!');
参考自: