Js相关笔记-2

持续更新,主要方便于存一些笔记。


闭包

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('这是自定义的错误!');

参考自:

JavaScript 标准参考教程(alpha) -- JavaScript 标准参考教程(alpha)

你可能感兴趣的:(Js相关笔记-2)