Js相關(guān)筆記-2

持續(xù)更新,主要方便于存一些筆記。


閉包

function f1() {

? var n = 999;

? function f2() {

? ? console.log(n);

? }

? return f2;

}

var result = f1();

result(); // 999

閉包就是函數(shù)f2,即能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。由于在 JavaScript 語(yǔ)言中,只有函數(shù)內(nèi)部的子函數(shù)才能讀取內(nèi)部變量,因此可以把閉包簡(jiǎn)單理解成“定義在一個(gè)函數(shù)內(nèi)部的函數(shù)”。閉包最大的特點(diǎn),就是它可以“記住”誕生的環(huán)境,比如f2記住了它誕生的環(huán)境f1,所以從f2可以得到f1的內(nèi)部變量。在本質(zhì)上,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的一座橋梁。

(閉包的最大用處有兩個(gè),一個(gè)是可以讀取函數(shù)內(nèi)部的變量,另一個(gè)就是讓這些變量始終保持在內(nèi)存中)


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

閉包的另一個(gè)用處,是封裝對(duì)象的私有屬性和私有方法。

注意,外層函數(shù)每次運(yùn)行,都會(huì)生成一個(gè)新的閉包,而這個(gè)閉包又會(huì)保留外層函數(shù)的內(nèi)部變量,所以內(nèi)存消耗很大。因此不能濫用閉包,否則會(huì)造成網(wǎng)頁(yè)的性能問題。



數(shù)據(jù)類型轉(zhuǎn)換

(自動(dòng)轉(zhuǎn)換)

'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轉(zhuǎn)為數(shù)值時(shí)為0,而undefined轉(zhuǎn)為數(shù)值時(shí)為NaN。

Js 遇到預(yù)期為數(shù)值的地方,就會(huì)將參數(shù)值自動(dòng)轉(zhuǎn)換為數(shù)值

'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函數(shù)可以將任意類型的值轉(zhuǎn)為布爾值。它的轉(zhuǎn)換規(guī)則相對(duì)簡(jiǎn)單:除了以下五個(gè)值的轉(zhuǎn)換結(jié)果為false,其他的值全部為true。undefinednull-0或+0NaN''(空字符串)

Number()函數(shù)一般轉(zhuǎn)為數(shù)值,除了混雜的,或者對(duì)象(數(shù)據(jù),除了[5]當(dāng)個(gè)數(shù)值),轉(zhuǎn)為NaN

原生錯(cuò)誤類型


var 1a;

// Uncaught SyntaxError: Invalid or unexpected token

SyntaxError對(duì)象是解析代碼時(shí)發(fā)生的語(yǔ)法錯(cuò)誤。

unknownVariable // Uncaught ReferenceError: unknownVariable is not defined

ReferenceError對(duì)象是引用一個(gè)不存在的變量時(shí)發(fā)生的錯(cuò)誤。

// ReferenceError: Invalid left-hand side in assignment

另一種觸發(fā)場(chǎng)景是,將一個(gè)值分配給無(wú)法分配的對(duì)象,比如對(duì)函數(shù)的運(yùn)行結(jié)果或者this賦值。

RangeError對(duì)象是一個(gè)值超出有效范圍時(shí)發(fā)生的錯(cuò)誤

TypeError對(duì)象是變量或參數(shù)不是預(yù)期類型時(shí)發(fā)生的錯(cuò)誤

URIError對(duì)象是 URI 相關(guān)函數(shù)的參數(shù)不正確時(shí)拋出的錯(cuò)誤

除了 JavaScript 原生提供的七種錯(cuò)誤對(duì)象,還可以定義自己的錯(cuò)誤對(duì)象。

function UserError(message) {

this.message = message || '默認(rèn)信息';

this.name = 'UserError'; }

UserError.prototype = new Error();

UserError.prototype.constructor = UserError;

上面代碼自定義一個(gè)錯(cuò)誤對(duì)象UserError,讓它繼承Error對(duì)象。然后,就可以生成這種自定義類型的錯(cuò)誤了。

new UserError('這是自定義的錯(cuò)誤!');

參考自:

JavaScript 標(biāo)準(zhǔn)參考教程(alpha) -- JavaScript 標(biāo)準(zhǔn)參考教程(alpha)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,596評(píng)論 0 13
  • 閉包(closure)是Javascript語(yǔ)言的一個(gè)難點(diǎn),也是它的特色,很多高級(jí)應(yīng)用都要依靠閉包實(shí)現(xiàn)。 要理解閉...
    青春前行閱讀 304評(píng)論 0 0
  • 函數(shù)是一段可以反復(fù)調(diào)用的代碼塊。函數(shù)還能接受輸入的參數(shù),不同的參數(shù)會(huì)返回不同的值。 概述 函數(shù)的聲明 JavaSc...
    許先生__閱讀 499評(píng)論 0 1
  • 今天心情很好,想起昨天發(fā)表了一個(gè)心情。有個(gè)客戶給我留言,說每天都很喜歡看我的分享,很受益。覺得好開心。自己每天所做...
    林玉珍閱讀 489評(píng)論 0 5
  • 《了凡四訓(xùn)》之《改過之法》 袁了凡 春秋諸大夫,見人言動(dòng),億而談其禍福,靡不驗(yàn)者,左國(guó)諸記可觀也。大都吉兇之兆,萌...
    愛的風(fēng)鈴閱讀 574評(píng)論 0 1

友情鏈接更多精彩內(nèi)容