[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"knowledge-\u002Fapi\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fadvanced":3,"knowledge-related-\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fadvanced":2158,"knowledge-series-\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fadvanced":2183},{"source":4,"connector":5,"page":6},"sqlite","better-sqlite3",{"path":7,"title":8,"description":9,"category":10,"tags":11,"date":14,"pinned":15,"draft":15,"body":16,"seo":2154,"stem":2155,"id":2156,"extension":2157},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fadvanced","函数进阶","this 绑定、高阶函数、纯函数、记忆化、递归与 IIFE 等是日常开发与面试中的核心主题。前置：语言基础、作用域与闭包。","技能小册",[12,13],"javascript","advanced","2022-10-24",false,{"type":17,"value":18,"toc":2132},"minimark",[19,22,41,49,59,64,85,161,165,171,275,285,289,304,326,492,500,507,595,604,610,631,777,781,790,794,955,959,962,1056,1060,1063,1220,1224,1241,1339,1342,1346,1352,1650,1654,1678,1836,1850,1854,1860,1924,1944,1985,1988,2036,2039,2042,2045,2128],[20,21,8],"h1",{"id":8},[23,24,25,29,30,35,36,40],"p",{},[26,27,28],"code",{},"this"," 绑定、高阶函数、纯函数、记忆化、递归与 IIFE 等是日常开发与面试中的核心主题。前置：",[31,32,34],"a",{"href":33},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fbasics","语言基础","、",[31,37,39],{"href":38},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fscope","作用域与闭包","。",[42,43,45,46,48],"h2",{"id":44},"一this-绑定规则","一、",[26,47,28],{}," 绑定规则",[23,50,51,53,54,58],{},[26,52,28],{}," 的值取决于",[55,56,57],"strong",{},"函数被调用的方式","，而非定义时的位置。共有四种绑定规则，优先级从低到高。",[60,61,63],"h3",{"id":62},"_1-默认绑定","1. 默认绑定",[23,65,66,67,69,70,73,74,77,78,81,82,40],{},"非严格模式下，独立函数调用时 ",[26,68,28],{}," 为全局对象（",[26,71,72],{},"globalThis","）；",[55,75,76],{},"严格模式","或",[55,79,80],{},"模块","顶层中为 ",[26,83,84],{},"undefined",[86,87,92],"pre",{"className":88,"code":89,"language":90,"meta":91,"style":91},"language-js shiki shiki-themes material-theme-lighter github-light github-dark","function foo() {\n    console.log(this);\n}\nfoo(); \u002F\u002F 非严格: window; 严格: undefined\n","js","",[26,93,94,114,140,146],{"__ignoreMap":91},[95,96,99,103,107,111],"span",{"class":97,"line":98},"line",1,[95,100,102],{"class":101},"sbsja","function",[95,104,106],{"class":105},"sGLFI"," foo",[95,108,110],{"class":109},"sP7_E","()",[95,112,113],{"class":109}," {\n",[95,115,117,121,124,127,131,134,137],{"class":97,"line":116},2,[95,118,120],{"class":119},"su5hD","    console",[95,122,123],{"class":109},".",[95,125,126],{"class":105},"log",[95,128,130],{"class":129},"skxfh","(",[95,132,28],{"class":133},"s39Yj",[95,135,136],{"class":129},")",[95,138,139],{"class":109},";\n",[95,141,143],{"class":97,"line":142},3,[95,144,145],{"class":109},"}\n",[95,147,149,152,154,157],{"class":97,"line":148},4,[95,150,151],{"class":105},"foo",[95,153,110],{"class":119},[95,155,156],{"class":109},";",[95,158,160],{"class":159},"sutJx"," \u002F\u002F 非严格: window; 严格: undefined\n",[60,162,164],{"id":163},"_2-隐式绑定","2. 隐式绑定",[23,166,167,168,170],{},"通过对象调用方法时，",[26,169,28],{}," 指向该对象。",[86,172,174],{"className":88,"code":173,"language":90,"meta":91,"style":91},"const obj = {\n    name: \"Alice\",\n    greet() {\n        console.log(this.name);\n    },\n};\nobj.greet(); \u002F\u002F 'Alice'\n",[26,175,176,191,213,223,245,251,257],{"__ignoreMap":91},[95,177,178,181,185,189],{"class":97,"line":98},[95,179,180],{"class":101},"const",[95,182,184],{"class":183},"s_hVV"," obj",[95,186,188],{"class":187},"smGrS"," =",[95,190,113],{"class":109},[95,192,193,196,199,203,207,210],{"class":97,"line":116},[95,194,195],{"class":129},"    name",[95,197,198],{"class":109},":",[95,200,202],{"class":201},"sjJ54"," \"",[95,204,206],{"class":205},"s_sjI","Alice",[95,208,209],{"class":201},"\"",[95,211,212],{"class":109},",\n",[95,214,215,219,221],{"class":97,"line":142},[95,216,218],{"class":217},"sVXei","    greet",[95,220,110],{"class":109},[95,222,113],{"class":109},[95,224,225,228,230,232,234,236,238,241,243],{"class":97,"line":148},[95,226,227],{"class":119},"        console",[95,229,123],{"class":109},[95,231,126],{"class":105},[95,233,130],{"class":129},[95,235,28],{"class":133},[95,237,123],{"class":109},[95,239,240],{"class":119},"name",[95,242,136],{"class":129},[95,244,139],{"class":109},[95,246,248],{"class":97,"line":247},5,[95,249,250],{"class":109},"    },\n",[95,252,254],{"class":97,"line":253},6,[95,255,256],{"class":109},"};\n",[95,258,260,263,265,268,270,272],{"class":97,"line":259},7,[95,261,262],{"class":119},"obj",[95,264,123],{"class":109},[95,266,267],{"class":105},"greet",[95,269,110],{"class":119},[95,271,156],{"class":109},[95,273,274],{"class":159}," \u002F\u002F 'Alice'\n",[23,276,277,280,281,284],{},[55,278,279],{},"注意","：隐式绑定容易丢失，例如 ",[26,282,283],{},"const fn = obj.greet; fn()"," 恢复为默认绑定。",[60,286,288],{"id":287},"_3-显式绑定","3. 显式绑定",[23,290,291,292,35,295,35,298,301,302,40],{},"使用 ",[26,293,294],{},"call",[26,296,297],{},"apply",[26,299,300],{},"bind"," 手动指定 ",[26,303,28],{},[305,306,307,314,320],"ul",{},[308,309,310,313],"li",{},[26,311,312],{},"call(thisArg, arg1, arg2, ...)"," – 立即执行，参数逐个传递。",[308,315,316,319],{},[26,317,318],{},"apply(thisArg, [argsArray])"," – 立即执行，参数以数组形式传递。",[308,321,322,325],{},[26,323,324],{},"bind(thisArg, ...)"," – 返回一个新函数，可延迟执行。",[86,327,329],{"className":88,"code":328,"language":90,"meta":91,"style":91},"function say(age) {\n    console.log(this.name, age);\n}\nconst person = { name: \"Bob\" };\nsay.call(person, 25); \u002F\u002F Bob 25\nsay.apply(person, [25]); \u002F\u002F Bob 25\nconst bound = say.bind(person, 25);\nbound(); \u002F\u002F Bob 25\n",[26,330,331,348,374,378,405,430,455,480],{"__ignoreMap":91},[95,332,333,335,338,340,344,346],{"class":97,"line":98},[95,334,102],{"class":101},[95,336,337],{"class":105}," say",[95,339,130],{"class":109},[95,341,343],{"class":342},"s99_P","age",[95,345,136],{"class":109},[95,347,113],{"class":109},[95,349,350,352,354,356,358,360,362,364,367,370,372],{"class":97,"line":116},[95,351,120],{"class":119},[95,353,123],{"class":109},[95,355,126],{"class":105},[95,357,130],{"class":129},[95,359,28],{"class":133},[95,361,123],{"class":109},[95,363,240],{"class":119},[95,365,366],{"class":109},",",[95,368,369],{"class":119}," age",[95,371,136],{"class":129},[95,373,139],{"class":109},[95,375,376],{"class":97,"line":142},[95,377,145],{"class":109},[95,379,380,382,385,387,390,393,395,397,400,402],{"class":97,"line":148},[95,381,180],{"class":101},[95,383,384],{"class":183}," person",[95,386,188],{"class":187},[95,388,389],{"class":109}," {",[95,391,392],{"class":129}," name",[95,394,198],{"class":109},[95,396,202],{"class":201},[95,398,399],{"class":205},"Bob",[95,401,209],{"class":201},[95,403,404],{"class":109}," };\n",[95,406,407,410,412,414,417,419,423,425,427],{"class":97,"line":247},[95,408,409],{"class":119},"say",[95,411,123],{"class":109},[95,413,294],{"class":105},[95,415,416],{"class":119},"(person",[95,418,366],{"class":109},[95,420,422],{"class":421},"srdBf"," 25",[95,424,136],{"class":119},[95,426,156],{"class":109},[95,428,429],{"class":159}," \u002F\u002F Bob 25\n",[95,431,432,434,436,438,440,442,445,448,451,453],{"class":97,"line":253},[95,433,409],{"class":119},[95,435,123],{"class":109},[95,437,297],{"class":105},[95,439,416],{"class":119},[95,441,366],{"class":109},[95,443,444],{"class":119}," [",[95,446,447],{"class":421},"25",[95,449,450],{"class":119},"])",[95,452,156],{"class":109},[95,454,429],{"class":159},[95,456,457,459,462,464,466,468,470,472,474,476,478],{"class":97,"line":259},[95,458,180],{"class":101},[95,460,461],{"class":183}," bound",[95,463,188],{"class":187},[95,465,337],{"class":119},[95,467,123],{"class":109},[95,469,300],{"class":105},[95,471,416],{"class":119},[95,473,366],{"class":109},[95,475,422],{"class":421},[95,477,136],{"class":119},[95,479,139],{"class":109},[95,481,483,486,488,490],{"class":97,"line":482},8,[95,484,485],{"class":105},"bound",[95,487,110],{"class":119},[95,489,156],{"class":109},[95,491,429],{"class":159},[60,493,495,496,499],{"id":494},"_4-new-绑定","4. ",[26,497,498],{},"new"," 绑定",[23,501,291,502,504,505,40],{},[26,503,498],{}," 调用函数时，会创建一个新对象，并将该对象绑定为 ",[26,506,28],{},[86,508,510],{"className":88,"code":509,"language":90,"meta":91,"style":91},"function Person(name) {\n    this.name = name;\n}\nconst p = new Person(\"Charlie\");\nconsole.log(p.name); \u002F\u002F 'Charlie'\n",[26,511,512,527,542,546,573],{"__ignoreMap":91},[95,513,514,516,519,521,523,525],{"class":97,"line":98},[95,515,102],{"class":101},[95,517,518],{"class":105}," Person",[95,520,130],{"class":109},[95,522,240],{"class":342},[95,524,136],{"class":109},[95,526,113],{"class":109},[95,528,529,532,534,536,538,540],{"class":97,"line":116},[95,530,531],{"class":133},"    this",[95,533,123],{"class":109},[95,535,240],{"class":119},[95,537,188],{"class":187},[95,539,392],{"class":119},[95,541,139],{"class":109},[95,543,544],{"class":97,"line":142},[95,545,145],{"class":109},[95,547,548,550,553,555,558,560,562,564,567,569,571],{"class":97,"line":148},[95,549,180],{"class":101},[95,551,552],{"class":183}," p",[95,554,188],{"class":187},[95,556,557],{"class":187}," new",[95,559,518],{"class":105},[95,561,130],{"class":119},[95,563,209],{"class":201},[95,565,566],{"class":205},"Charlie",[95,568,209],{"class":201},[95,570,136],{"class":119},[95,572,139],{"class":109},[95,574,575,578,580,582,585,587,590,592],{"class":97,"line":247},[95,576,577],{"class":119},"console",[95,579,123],{"class":109},[95,581,126],{"class":105},[95,583,584],{"class":119},"(p",[95,586,123],{"class":109},[95,588,589],{"class":119},"name)",[95,591,156],{"class":109},[95,593,594],{"class":159}," \u002F\u002F 'Charlie'\n",[23,596,597,600,601,603],{},[55,598,599],{},"优先级","：",[26,602,498],{}," 绑定 > 显式绑定 > 隐式绑定 > 默认绑定。",[60,605,607,608],{"id":606},"_5-箭头函数的词法-this","5. 箭头函数的词法 ",[26,609,28],{},[23,611,612,613,615,616,619,620,622,623,625,626,625,628,630],{},"箭头函数没有自己的 ",[26,614,28],{},"，它捕获",[55,617,618],{},"外层（定义时）作用域","的 ",[26,621,28],{}," 值，且无法被 ",[26,624,294],{},"\u002F",[26,627,297],{},[26,629,300],{}," 改变。",[86,632,634],{"className":88,"code":633,"language":90,"meta":91,"style":91},"const obj = {\n    name: \"Diana\",\n    regular: function () {\n        console.log(this.name);\n    },\n    arrow: () => {\n        console.log(this.name);\n    },\n};\nobj.regular(); \u002F\u002F 'Diana'\nobj.arrow(); \u002F\u002F undefined (this 指向外层，此处为全局)\n",[26,635,636,646,661,676,696,700,714,734,738,743,760],{"__ignoreMap":91},[95,637,638,640,642,644],{"class":97,"line":98},[95,639,180],{"class":101},[95,641,184],{"class":183},[95,643,188],{"class":187},[95,645,113],{"class":109},[95,647,648,650,652,654,657,659],{"class":97,"line":116},[95,649,195],{"class":129},[95,651,198],{"class":109},[95,653,202],{"class":201},[95,655,656],{"class":205},"Diana",[95,658,209],{"class":201},[95,660,212],{"class":109},[95,662,663,666,668,671,674],{"class":97,"line":142},[95,664,665],{"class":105},"    regular",[95,667,198],{"class":109},[95,669,670],{"class":101}," function",[95,672,673],{"class":109}," ()",[95,675,113],{"class":109},[95,677,678,680,682,684,686,688,690,692,694],{"class":97,"line":148},[95,679,227],{"class":119},[95,681,123],{"class":109},[95,683,126],{"class":105},[95,685,130],{"class":129},[95,687,28],{"class":133},[95,689,123],{"class":109},[95,691,240],{"class":119},[95,693,136],{"class":129},[95,695,139],{"class":109},[95,697,698],{"class":97,"line":247},[95,699,250],{"class":109},[95,701,702,705,707,709,712],{"class":97,"line":253},[95,703,704],{"class":105},"    arrow",[95,706,198],{"class":109},[95,708,673],{"class":109},[95,710,711],{"class":101}," =>",[95,713,113],{"class":109},[95,715,716,718,720,722,724,726,728,730,732],{"class":97,"line":259},[95,717,227],{"class":119},[95,719,123],{"class":109},[95,721,126],{"class":105},[95,723,130],{"class":129},[95,725,28],{"class":133},[95,727,123],{"class":109},[95,729,240],{"class":119},[95,731,136],{"class":129},[95,733,139],{"class":109},[95,735,736],{"class":97,"line":482},[95,737,250],{"class":109},[95,739,741],{"class":97,"line":740},9,[95,742,256],{"class":109},[95,744,746,748,750,753,755,757],{"class":97,"line":745},10,[95,747,262],{"class":119},[95,749,123],{"class":109},[95,751,752],{"class":105},"regular",[95,754,110],{"class":119},[95,756,156],{"class":109},[95,758,759],{"class":159}," \u002F\u002F 'Diana'\n",[95,761,763,765,767,770,772,774],{"class":97,"line":762},11,[95,764,262],{"class":119},[95,766,123],{"class":109},[95,768,769],{"class":105},"arrow",[95,771,110],{"class":119},[95,773,156],{"class":109},[95,775,776],{"class":159}," \u002F\u002F undefined (this 指向外层，此处为全局)\n",[42,778,780],{"id":779},"二高阶函数","二、高阶函数",[23,782,783,784,35,787,40],{},"高阶函数满足至少一个条件：",[55,785,786],{},"接收函数作为参数",[55,788,789],{},"返回一个函数",[60,791,793],{"id":792},"_1-函数作为参数返回值","1. 函数作为参数\u002F返回值",[86,795,797],{"className":88,"code":796,"language":90,"meta":91,"style":91},"\u002F\u002F 参数\n[1, 2, 3].map(x => x * 2);\n\n\u002F\u002F 返回值\nfunction multiplyBy(factor) {\n    return function (x) {\n        return x * factor;\n    };\n}\nconst double = multiplyBy(2);\ndouble(5); \u002F\u002F 10\n",[26,798,799,804,849,855,860,876,893,909,914,918,938],{"__ignoreMap":91},[95,800,801],{"class":97,"line":98},[95,802,803],{"class":159},"\u002F\u002F 参数\n",[95,805,806,809,812,814,817,819,822,825,827,830,832,835,837,840,843,845,847],{"class":97,"line":116},[95,807,808],{"class":119},"[",[95,810,811],{"class":421},"1",[95,813,366],{"class":109},[95,815,816],{"class":421}," 2",[95,818,366],{"class":109},[95,820,821],{"class":421}," 3",[95,823,824],{"class":119},"]",[95,826,123],{"class":109},[95,828,829],{"class":105},"map",[95,831,130],{"class":119},[95,833,834],{"class":342},"x",[95,836,711],{"class":101},[95,838,839],{"class":119}," x ",[95,841,842],{"class":187},"*",[95,844,816],{"class":421},[95,846,136],{"class":119},[95,848,139],{"class":109},[95,850,851],{"class":97,"line":142},[95,852,854],{"emptyLinePlaceholder":853},true,"\n",[95,856,857],{"class":97,"line":148},[95,858,859],{"class":159},"\u002F\u002F 返回值\n",[95,861,862,864,867,869,872,874],{"class":97,"line":247},[95,863,102],{"class":101},[95,865,866],{"class":105}," multiplyBy",[95,868,130],{"class":109},[95,870,871],{"class":342},"factor",[95,873,136],{"class":109},[95,875,113],{"class":109},[95,877,878,882,884,887,889,891],{"class":97,"line":253},[95,879,881],{"class":880},"sVHd0","    return",[95,883,670],{"class":101},[95,885,886],{"class":109}," (",[95,888,834],{"class":342},[95,890,136],{"class":109},[95,892,113],{"class":109},[95,894,895,898,901,904,907],{"class":97,"line":259},[95,896,897],{"class":880},"        return",[95,899,900],{"class":119}," x",[95,902,903],{"class":187}," *",[95,905,906],{"class":119}," factor",[95,908,139],{"class":109},[95,910,911],{"class":97,"line":482},[95,912,913],{"class":109},"    };\n",[95,915,916],{"class":97,"line":740},[95,917,145],{"class":109},[95,919,920,922,925,927,929,931,934,936],{"class":97,"line":745},[95,921,180],{"class":101},[95,923,924],{"class":183}," double",[95,926,188],{"class":187},[95,928,866],{"class":105},[95,930,130],{"class":119},[95,932,933],{"class":421},"2",[95,935,136],{"class":119},[95,937,139],{"class":109},[95,939,940,943,945,948,950,952],{"class":97,"line":762},[95,941,942],{"class":105},"double",[95,944,130],{"class":119},[95,946,947],{"class":421},"5",[95,949,136],{"class":119},[95,951,156],{"class":109},[95,953,954],{"class":159}," \u002F\u002F 10\n",[60,956,958],{"id":957},"_2-柯里化currying","2. 柯里化（Currying）",[23,960,961],{},"将一个多参数函数转化为一系列单参数函数。",[86,963,965],{"className":88,"code":964,"language":90,"meta":91,"style":91},"function add(a) {\n    return function (b) {\n        return a + b;\n    };\n}\nconst add5 = add(5);\nadd5(3); \u002F\u002F 8\n",[26,966,967,982,997,1012,1016,1020,1039],{"__ignoreMap":91},[95,968,969,971,974,976,978,980],{"class":97,"line":98},[95,970,102],{"class":101},[95,972,973],{"class":105}," add",[95,975,130],{"class":109},[95,977,31],{"class":342},[95,979,136],{"class":109},[95,981,113],{"class":109},[95,983,984,986,988,990,993,995],{"class":97,"line":116},[95,985,881],{"class":880},[95,987,670],{"class":101},[95,989,886],{"class":109},[95,991,992],{"class":342},"b",[95,994,136],{"class":109},[95,996,113],{"class":109},[95,998,999,1001,1004,1007,1010],{"class":97,"line":142},[95,1000,897],{"class":880},[95,1002,1003],{"class":119}," a",[95,1005,1006],{"class":187}," +",[95,1008,1009],{"class":119}," b",[95,1011,139],{"class":109},[95,1013,1014],{"class":97,"line":148},[95,1015,913],{"class":109},[95,1017,1018],{"class":97,"line":247},[95,1019,145],{"class":109},[95,1021,1022,1024,1027,1029,1031,1033,1035,1037],{"class":97,"line":253},[95,1023,180],{"class":101},[95,1025,1026],{"class":183}," add5",[95,1028,188],{"class":187},[95,1030,973],{"class":105},[95,1032,130],{"class":119},[95,1034,947],{"class":421},[95,1036,136],{"class":119},[95,1038,139],{"class":109},[95,1040,1041,1044,1046,1049,1051,1053],{"class":97,"line":259},[95,1042,1043],{"class":105},"add5",[95,1045,130],{"class":119},[95,1047,1048],{"class":421},"3",[95,1050,136],{"class":119},[95,1052,156],{"class":109},[95,1054,1055],{"class":159}," \u002F\u002F 8\n",[60,1057,1059],{"id":1058},"_3-组合函数compose","3. 组合函数（Compose）",[23,1061,1062],{},"将多个函数从右向左组合执行。",[86,1064,1066],{"className":88,"code":1065,"language":90,"meta":91,"style":91},"const compose =\n    (...fns) =>\n    init =>\n        fns.reduceRight((val, fn) => fn(val), init);\nconst add1 = x => x + 1;\nconst double = x => x * 2;\nconst add1ThenDouble = compose(double, add1);\nadd1ThenDouble(3); \u002F\u002F (3+1)*2 = 8\n",[26,1067,1068,1078,1094,1101,1139,1163,1183,1204],{"__ignoreMap":91},[95,1069,1070,1072,1075],{"class":97,"line":98},[95,1071,180],{"class":101},[95,1073,1074],{"class":183}," compose",[95,1076,1077],{"class":187}," =\n",[95,1079,1080,1083,1086,1089,1091],{"class":97,"line":116},[95,1081,1082],{"class":109},"    (",[95,1084,1085],{"class":187},"...",[95,1087,1088],{"class":342},"fns",[95,1090,136],{"class":109},[95,1092,1093],{"class":101}," =>\n",[95,1095,1096,1099],{"class":97,"line":142},[95,1097,1098],{"class":342},"    init",[95,1100,1093],{"class":101},[95,1102,1103,1106,1108,1111,1113,1115,1118,1120,1123,1125,1127,1129,1132,1134,1137],{"class":97,"line":148},[95,1104,1105],{"class":119},"        fns",[95,1107,123],{"class":109},[95,1109,1110],{"class":105},"reduceRight",[95,1112,130],{"class":119},[95,1114,130],{"class":109},[95,1116,1117],{"class":342},"val",[95,1119,366],{"class":109},[95,1121,1122],{"class":342}," fn",[95,1124,136],{"class":109},[95,1126,711],{"class":101},[95,1128,1122],{"class":105},[95,1130,1131],{"class":119},"(val)",[95,1133,366],{"class":109},[95,1135,1136],{"class":119}," init)",[95,1138,139],{"class":109},[95,1140,1141,1143,1147,1149,1151,1153,1155,1158,1161],{"class":97,"line":247},[95,1142,180],{"class":101},[95,1144,1146],{"class":1145},"sfCm-"," add1",[95,1148,188],{"class":187},[95,1150,900],{"class":342},[95,1152,711],{"class":101},[95,1154,839],{"class":119},[95,1156,1157],{"class":187},"+",[95,1159,1160],{"class":421}," 1",[95,1162,139],{"class":109},[95,1164,1165,1167,1169,1171,1173,1175,1177,1179,1181],{"class":97,"line":253},[95,1166,180],{"class":101},[95,1168,924],{"class":1145},[95,1170,188],{"class":187},[95,1172,900],{"class":342},[95,1174,711],{"class":101},[95,1176,839],{"class":119},[95,1178,842],{"class":187},[95,1180,816],{"class":421},[95,1182,139],{"class":109},[95,1184,1185,1187,1190,1192,1194,1197,1199,1202],{"class":97,"line":259},[95,1186,180],{"class":101},[95,1188,1189],{"class":183}," add1ThenDouble",[95,1191,188],{"class":187},[95,1193,1074],{"class":105},[95,1195,1196],{"class":119},"(double",[95,1198,366],{"class":109},[95,1200,1201],{"class":119}," add1)",[95,1203,139],{"class":109},[95,1205,1206,1209,1211,1213,1215,1217],{"class":97,"line":482},[95,1207,1208],{"class":105},"add1ThenDouble",[95,1210,130],{"class":119},[95,1212,1048],{"class":421},[95,1214,136],{"class":119},[95,1216,156],{"class":109},[95,1218,1219],{"class":159}," \u002F\u002F (3+1)*2 = 8\n",[42,1221,1223],{"id":1222},"三纯函数与副作用","三、纯函数与副作用",[305,1225,1226,1236],{},[308,1227,1228,1231,1232,1235],{},[55,1229,1230],{},"纯函数","：相同的输入永远产生相同的输出，且不产生任何",[55,1233,1234],{},"副作用","（不修改外部状态、不依赖外部可变变量）。",[308,1237,1238,1240],{},[55,1239,1234],{},"：函数在执行过程中修改了外部环境（如修改全局变量、DOM 操作、读写文件、发送 HTTP 请求）。",[86,1242,1244],{"className":88,"code":1243,"language":90,"meta":91,"style":91},"\u002F\u002F 纯函数\nfunction add(a, b) {\n    return a + b;\n}\n\n\u002F\u002F 不纯（有副作用）\nlet counter = 0;\nfunction increment() {\n    counter++;\n} \u002F\u002F 修改外部变量\n",[26,1245,1246,1251,1269,1281,1285,1289,1294,1310,1321,1331],{"__ignoreMap":91},[95,1247,1248],{"class":97,"line":98},[95,1249,1250],{"class":159},"\u002F\u002F 纯函数\n",[95,1252,1253,1255,1257,1259,1261,1263,1265,1267],{"class":97,"line":116},[95,1254,102],{"class":101},[95,1256,973],{"class":105},[95,1258,130],{"class":109},[95,1260,31],{"class":342},[95,1262,366],{"class":109},[95,1264,1009],{"class":342},[95,1266,136],{"class":109},[95,1268,113],{"class":109},[95,1270,1271,1273,1275,1277,1279],{"class":97,"line":142},[95,1272,881],{"class":880},[95,1274,1003],{"class":119},[95,1276,1006],{"class":187},[95,1278,1009],{"class":119},[95,1280,139],{"class":109},[95,1282,1283],{"class":97,"line":148},[95,1284,145],{"class":109},[95,1286,1287],{"class":97,"line":247},[95,1288,854],{"emptyLinePlaceholder":853},[95,1290,1291],{"class":97,"line":253},[95,1292,1293],{"class":159},"\u002F\u002F 不纯（有副作用）\n",[95,1295,1296,1299,1302,1305,1308],{"class":97,"line":259},[95,1297,1298],{"class":101},"let",[95,1300,1301],{"class":119}," counter ",[95,1303,1304],{"class":187},"=",[95,1306,1307],{"class":421}," 0",[95,1309,139],{"class":109},[95,1311,1312,1314,1317,1319],{"class":97,"line":482},[95,1313,102],{"class":101},[95,1315,1316],{"class":105}," increment",[95,1318,110],{"class":109},[95,1320,113],{"class":109},[95,1322,1323,1326,1329],{"class":97,"line":740},[95,1324,1325],{"class":119},"    counter",[95,1327,1328],{"class":187},"++",[95,1330,139],{"class":109},[95,1332,1333,1336],{"class":97,"line":745},[95,1334,1335],{"class":109},"}",[95,1337,1338],{"class":159}," \u002F\u002F 修改外部变量\n",[23,1340,1341],{},"纯函数易于测试、缓存、并发执行，是函数式编程的基石。",[42,1343,1345],{"id":1344},"四函数记忆memoization","四、函数记忆（Memoization）",[23,1347,1348,1349,1351],{},"缓存函数的计算结果，避免重复运算。适用于",[55,1350,1230],{},"且开销较大的场景。",[86,1353,1355],{"className":88,"code":1354,"language":90,"meta":91,"style":91},"function memoize(fn) {\n    const cache = new Map();\n    return function (...args) {\n        const key = JSON.stringify(args);\n        if (cache.has(key)) return cache.get(key);\n        const result = fn(...args);\n        cache.set(key, result);\n        return result;\n    };\n}\n\nconst fib = memoize(function (n) {\n    if (n \u003C 2) return n;\n    return fib(n - 1) + fib(n - 2);\n});\nfib(40); \u002F\u002F 极快，因为缓存了中间结果\n",[26,1356,1357,1373,1392,1409,1435,1476,1497,1519,1527,1531,1535,1539,1564,1589,1623,1632],{"__ignoreMap":91},[95,1358,1359,1361,1364,1366,1369,1371],{"class":97,"line":98},[95,1360,102],{"class":101},[95,1362,1363],{"class":105}," memoize",[95,1365,130],{"class":109},[95,1367,1368],{"class":342},"fn",[95,1370,136],{"class":109},[95,1372,113],{"class":109},[95,1374,1375,1378,1381,1383,1385,1388,1390],{"class":97,"line":116},[95,1376,1377],{"class":101},"    const",[95,1379,1380],{"class":183}," cache",[95,1382,188],{"class":187},[95,1384,557],{"class":187},[95,1386,1387],{"class":105}," Map",[95,1389,110],{"class":129},[95,1391,139],{"class":109},[95,1393,1394,1396,1398,1400,1402,1405,1407],{"class":97,"line":142},[95,1395,881],{"class":880},[95,1397,670],{"class":101},[95,1399,886],{"class":109},[95,1401,1085],{"class":187},[95,1403,1404],{"class":342},"args",[95,1406,136],{"class":109},[95,1408,113],{"class":109},[95,1410,1411,1414,1417,1419,1422,1424,1427,1429,1431,1433],{"class":97,"line":148},[95,1412,1413],{"class":101},"        const",[95,1415,1416],{"class":183}," key",[95,1418,188],{"class":187},[95,1420,1421],{"class":183}," JSON",[95,1423,123],{"class":109},[95,1425,1426],{"class":105},"stringify",[95,1428,130],{"class":129},[95,1430,1404],{"class":119},[95,1432,136],{"class":129},[95,1434,139],{"class":109},[95,1436,1437,1440,1442,1445,1447,1450,1452,1455,1458,1461,1463,1465,1468,1470,1472,1474],{"class":97,"line":247},[95,1438,1439],{"class":880},"        if",[95,1441,886],{"class":129},[95,1443,1444],{"class":119},"cache",[95,1446,123],{"class":109},[95,1448,1449],{"class":105},"has",[95,1451,130],{"class":129},[95,1453,1454],{"class":119},"key",[95,1456,1457],{"class":129},")) ",[95,1459,1460],{"class":880},"return",[95,1462,1380],{"class":119},[95,1464,123],{"class":109},[95,1466,1467],{"class":105},"get",[95,1469,130],{"class":129},[95,1471,1454],{"class":119},[95,1473,136],{"class":129},[95,1475,139],{"class":109},[95,1477,1478,1480,1483,1485,1487,1489,1491,1493,1495],{"class":97,"line":253},[95,1479,1413],{"class":101},[95,1481,1482],{"class":183}," result",[95,1484,188],{"class":187},[95,1486,1122],{"class":105},[95,1488,130],{"class":129},[95,1490,1085],{"class":187},[95,1492,1404],{"class":119},[95,1494,136],{"class":129},[95,1496,139],{"class":109},[95,1498,1499,1502,1504,1507,1509,1511,1513,1515,1517],{"class":97,"line":259},[95,1500,1501],{"class":119},"        cache",[95,1503,123],{"class":109},[95,1505,1506],{"class":105},"set",[95,1508,130],{"class":129},[95,1510,1454],{"class":119},[95,1512,366],{"class":109},[95,1514,1482],{"class":119},[95,1516,136],{"class":129},[95,1518,139],{"class":109},[95,1520,1521,1523,1525],{"class":97,"line":482},[95,1522,897],{"class":880},[95,1524,1482],{"class":119},[95,1526,139],{"class":109},[95,1528,1529],{"class":97,"line":740},[95,1530,913],{"class":109},[95,1532,1533],{"class":97,"line":745},[95,1534,145],{"class":109},[95,1536,1537],{"class":97,"line":762},[95,1538,854],{"emptyLinePlaceholder":853},[95,1540,1542,1544,1547,1549,1551,1553,1555,1557,1560,1562],{"class":97,"line":1541},12,[95,1543,180],{"class":101},[95,1545,1546],{"class":183}," fib",[95,1548,188],{"class":187},[95,1550,1363],{"class":105},[95,1552,130],{"class":119},[95,1554,102],{"class":101},[95,1556,886],{"class":109},[95,1558,1559],{"class":342},"n",[95,1561,136],{"class":109},[95,1563,113],{"class":109},[95,1565,1567,1570,1572,1574,1577,1579,1582,1584,1587],{"class":97,"line":1566},13,[95,1568,1569],{"class":880},"    if",[95,1571,886],{"class":129},[95,1573,1559],{"class":119},[95,1575,1576],{"class":187}," \u003C",[95,1578,816],{"class":421},[95,1580,1581],{"class":129},") ",[95,1583,1460],{"class":880},[95,1585,1586],{"class":119}," n",[95,1588,139],{"class":109},[95,1590,1592,1594,1596,1598,1600,1603,1605,1607,1609,1611,1613,1615,1617,1619,1621],{"class":97,"line":1591},14,[95,1593,881],{"class":880},[95,1595,1546],{"class":105},[95,1597,130],{"class":129},[95,1599,1559],{"class":119},[95,1601,1602],{"class":187}," -",[95,1604,1160],{"class":421},[95,1606,1581],{"class":129},[95,1608,1157],{"class":187},[95,1610,1546],{"class":105},[95,1612,130],{"class":129},[95,1614,1559],{"class":119},[95,1616,1602],{"class":187},[95,1618,816],{"class":421},[95,1620,136],{"class":129},[95,1622,139],{"class":109},[95,1624,1626,1628,1630],{"class":97,"line":1625},15,[95,1627,1335],{"class":109},[95,1629,136],{"class":119},[95,1631,139],{"class":109},[95,1633,1635,1638,1640,1643,1645,1647],{"class":97,"line":1634},16,[95,1636,1637],{"class":105},"fib",[95,1639,130],{"class":119},[95,1641,1642],{"class":421},"40",[95,1644,136],{"class":119},[95,1646,156],{"class":109},[95,1648,1649],{"class":159}," \u002F\u002F 极快，因为缓存了中间结果\n",[42,1651,1653],{"id":1652},"五递归与尾调用优化","五、递归与尾调用优化",[305,1655,1656,1666,1672],{},[308,1657,1658,1661,1662,1665],{},[55,1659,1660],{},"递归","：函数调用自身。可能导致",[55,1663,1664],{},"调用栈溢出","（递归深度过大）。",[308,1667,1668,1671],{},[55,1669,1670],{},"尾调用","：函数最后一步是调用另一个函数，并且该调用的返回值直接返回。",[308,1673,1674,1677],{},[55,1675,1676],{},"尾递归","：递归调用是尾调用。理论上编译器可以优化，复用当前栈帧，避免栈增长。",[86,1679,1681],{"className":88,"code":1680,"language":90,"meta":91,"style":91},"\u002F\u002F 普通递归（非尾递归）\nfunction factorial(n) {\n    if (n === 1) return 1;\n    return n * factorial(n - 1); \u002F\u002F 乘法是最后一步，不是尾调用\n}\n\n\u002F\u002F 尾递归版本\nfunction factorialTail(n, acc = 1) {\n    if (n === 1) return acc;\n    return factorialTail(n - 1, n * acc);\n}\n",[26,1682,1683,1688,1703,1724,1749,1753,1757,1762,1786,1806,1832],{"__ignoreMap":91},[95,1684,1685],{"class":97,"line":98},[95,1686,1687],{"class":159},"\u002F\u002F 普通递归（非尾递归）\n",[95,1689,1690,1692,1695,1697,1699,1701],{"class":97,"line":116},[95,1691,102],{"class":101},[95,1693,1694],{"class":105}," factorial",[95,1696,130],{"class":109},[95,1698,1559],{"class":342},[95,1700,136],{"class":109},[95,1702,113],{"class":109},[95,1704,1705,1707,1709,1711,1714,1716,1718,1720,1722],{"class":97,"line":142},[95,1706,1569],{"class":880},[95,1708,886],{"class":129},[95,1710,1559],{"class":119},[95,1712,1713],{"class":187}," ===",[95,1715,1160],{"class":421},[95,1717,1581],{"class":129},[95,1719,1460],{"class":880},[95,1721,1160],{"class":421},[95,1723,139],{"class":109},[95,1725,1726,1728,1730,1732,1734,1736,1738,1740,1742,1744,1746],{"class":97,"line":148},[95,1727,881],{"class":880},[95,1729,1586],{"class":119},[95,1731,903],{"class":187},[95,1733,1694],{"class":105},[95,1735,130],{"class":129},[95,1737,1559],{"class":119},[95,1739,1602],{"class":187},[95,1741,1160],{"class":421},[95,1743,136],{"class":129},[95,1745,156],{"class":109},[95,1747,1748],{"class":159}," \u002F\u002F 乘法是最后一步，不是尾调用\n",[95,1750,1751],{"class":97,"line":247},[95,1752,145],{"class":109},[95,1754,1755],{"class":97,"line":253},[95,1756,854],{"emptyLinePlaceholder":853},[95,1758,1759],{"class":97,"line":259},[95,1760,1761],{"class":159},"\u002F\u002F 尾递归版本\n",[95,1763,1764,1766,1769,1771,1773,1775,1778,1780,1782,1784],{"class":97,"line":482},[95,1765,102],{"class":101},[95,1767,1768],{"class":105}," factorialTail",[95,1770,130],{"class":109},[95,1772,1559],{"class":342},[95,1774,366],{"class":109},[95,1776,1777],{"class":342}," acc",[95,1779,188],{"class":187},[95,1781,1160],{"class":421},[95,1783,136],{"class":109},[95,1785,113],{"class":109},[95,1787,1788,1790,1792,1794,1796,1798,1800,1802,1804],{"class":97,"line":740},[95,1789,1569],{"class":880},[95,1791,886],{"class":129},[95,1793,1559],{"class":119},[95,1795,1713],{"class":187},[95,1797,1160],{"class":421},[95,1799,1581],{"class":129},[95,1801,1460],{"class":880},[95,1803,1777],{"class":119},[95,1805,139],{"class":109},[95,1807,1808,1810,1812,1814,1816,1818,1820,1822,1824,1826,1828,1830],{"class":97,"line":745},[95,1809,881],{"class":880},[95,1811,1768],{"class":105},[95,1813,130],{"class":129},[95,1815,1559],{"class":119},[95,1817,1602],{"class":187},[95,1819,1160],{"class":421},[95,1821,366],{"class":109},[95,1823,1586],{"class":119},[95,1825,903],{"class":187},[95,1827,1777],{"class":119},[95,1829,136],{"class":129},[95,1831,139],{"class":109},[95,1833,1834],{"class":97,"line":762},[95,1835,145],{"class":109},[23,1837,1838,1841,1842,1845,1846,1849],{},[55,1839,1840],{},"引擎支持","：ECMAScript 规定尾调用优化为可选实现。V8（Chrome、Node.js）",[55,1843,1844],{},"未实现"," PTC（proper tail calls）；Safari 的 JavaScriptCore 在严格模式下对部分尾递归有优化。工程上应用",[55,1847,1848],{},"循环","或**蹦床（trampoline）**保证栈深度可控。",[42,1851,1853],{"id":1852},"六iife-及其现代替代","六、IIFE 及其现代替代",[23,1855,1856,1859],{},[55,1857,1858],{},"IIFE","（Immediately Invoked Function Expression）定义后立即执行，用于创建独立作用域，避免污染全局。",[86,1861,1863],{"className":88,"code":1862,"language":90,"meta":91,"style":91},"(function () {\n    var privateVar = \"secret\";\n    console.log(\"IIFE runs\");\n})();\n",[26,1864,1865,1875,1894,1915],{"__ignoreMap":91},[95,1866,1867,1869,1871,1873],{"class":97,"line":98},[95,1868,130],{"class":119},[95,1870,102],{"class":101},[95,1872,673],{"class":109},[95,1874,113],{"class":109},[95,1876,1877,1880,1883,1885,1887,1890,1892],{"class":97,"line":116},[95,1878,1879],{"class":101},"    var",[95,1881,1882],{"class":119}," privateVar",[95,1884,188],{"class":187},[95,1886,202],{"class":201},[95,1888,1889],{"class":205},"secret",[95,1891,209],{"class":201},[95,1893,139],{"class":109},[95,1895,1896,1898,1900,1902,1904,1906,1909,1911,1913],{"class":97,"line":142},[95,1897,120],{"class":119},[95,1899,123],{"class":109},[95,1901,126],{"class":105},[95,1903,130],{"class":129},[95,1905,209],{"class":201},[95,1907,1908],{"class":205},"IIFE runs",[95,1910,209],{"class":201},[95,1912,136],{"class":129},[95,1914,139],{"class":109},[95,1916,1917,1919,1922],{"class":97,"line":148},[95,1918,1335],{"class":109},[95,1920,1921],{"class":119},")()",[95,1923,139],{"class":109},[23,1925,1926,1929,1930,1933,1934,1936,1937,1939,1940,1943],{},[55,1927,1928],{},"现代替代","：ES6 引入",[55,1931,1932],{},"块级作用域","（",[26,1935,1298],{}," \u002F ",[26,1938,180],{}," + ",[26,1941,1942],{},"{}","），无需函数包裹即可隔离变量。",[86,1945,1947],{"className":88,"code":1946,"language":90,"meta":91,"style":91},"{\n    let privateVar = \"secret\";\n    \u002F\u002F 仅在此块内有效\n}\n\u002F\u002F privateVar 不可访问\n",[26,1948,1949,1954,1971,1976,1980],{"__ignoreMap":91},[95,1950,1951],{"class":97,"line":98},[95,1952,1953],{"class":109},"{\n",[95,1955,1956,1959,1961,1963,1965,1967,1969],{"class":97,"line":116},[95,1957,1958],{"class":101},"    let",[95,1960,1882],{"class":119},[95,1962,188],{"class":187},[95,1964,202],{"class":201},[95,1966,1889],{"class":205},[95,1968,209],{"class":201},[95,1970,139],{"class":109},[95,1972,1973],{"class":97,"line":142},[95,1974,1975],{"class":159},"    \u002F\u002F 仅在此块内有效\n",[95,1977,1978],{"class":97,"line":148},[95,1979,145],{"class":109},[95,1981,1982],{"class":97,"line":247},[95,1983,1984],{"class":159},"\u002F\u002F privateVar 不可访问\n",[23,1986,1987],{},"另外，模块（ES Modules）天生提供作用域隔离，已成为主流方案。",[86,1989,1991],{"className":88,"code":1990,"language":90,"meta":91,"style":91},"\u002F\u002F module.js（`private` 是严格模式保留字，模块顶层严格模式下不能作为变量名，此处改名为 internal）\nconst internal = 42;\nexport const publicFn = () => { ... };\n",[26,1992,1993,1998,2012],{"__ignoreMap":91},[95,1994,1995],{"class":97,"line":98},[95,1996,1997],{"class":159},"\u002F\u002F module.js（`private` 是严格模式保留字，模块顶层严格模式下不能作为变量名，此处改名为 internal）\n",[95,1999,2000,2002,2005,2007,2010],{"class":97,"line":116},[95,2001,180],{"class":101},[95,2003,2004],{"class":183}," internal",[95,2006,188],{"class":187},[95,2008,2009],{"class":421}," 42",[95,2011,139],{"class":109},[95,2013,2014,2017,2020,2023,2025,2027,2029,2031,2034],{"class":97,"line":142},[95,2015,2016],{"class":880},"export",[95,2018,2019],{"class":101}," const",[95,2021,2022],{"class":1145}," publicFn",[95,2024,188],{"class":187},[95,2026,673],{"class":109},[95,2028,711],{"class":101},[95,2030,389],{"class":109},[95,2032,2033],{"class":187}," ...",[95,2035,404],{"class":109},[23,2037,2038],{},"除非需要立即执行逻辑且对旧环境兼容，否则推荐使用块级作用域或模块。",[42,2040,2041],{"id":2041},"参考文献",[23,2043,2044],{},"以下链接在编写时均可正常访问：",[2046,2047,2048,2061],"table",{},[2049,2050,2051],"thead",{},[2052,2053,2054,2058],"tr",{},[2055,2056,2057],"th",{},"资料",[2055,2059,2060],{},"说明",[2062,2063,2064,2078,2092,2104,2116],"tbody",{},[2052,2065,2066,2075],{},[2067,2068,2069],"td",{},[31,2070,2074],{"href":2071,"rel":2072},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fzh-CN\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FOperators\u002Fthis",[2073],"nofollow","MDN：this",[2067,2076,2077],{},"绑定规则",[2052,2079,2080,2087],{},[2067,2081,2082],{},[31,2083,2086],{"href":2084,"rel":2085},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fzh-CN\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FFunctions\u002FArrow_functions",[2073],"MDN：箭头函数",[2067,2088,2089,2090],{},"词法 ",[26,2091,28],{},[2052,2093,2094,2101],{},[2067,2095,2096],{},[31,2097,2100],{"href":2098,"rel":2099},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fzh-CN\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FGlobal_Objects\u002FFunction\u002Fbind",[2073],"MDN：Function.prototype.bind",[2067,2102,2103],{},"显式绑定",[2052,2105,2106,2113],{},[2067,2107,2108],{},[31,2109,2112],{"href":2110,"rel":2111},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FFunctions\u002FTail_calls",[2073],"MDN：尾调用优化",[2067,2114,2115],{},"TCO 说明（英文）",[2052,2117,2118,2125],{},[2067,2119,2120],{},[31,2121,2124],{"href":2122,"rel":2123},"https:\u002F\u002Ftc39.es\u002Fecma262\u002F#sec-tail-position-calls",[2073],"ECMA-262：尾位置调用",[2067,2126,2127],{},"规范（英文）",[2129,2130,2131],"style",{},"html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVXei, html code.shiki .sVXei{--shiki-light:#E53935;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sfCm-, html code.shiki .sfCm-{--shiki-light:#90A4AE;--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":91,"searchDepth":116,"depth":116,"links":2133},[2134,2144,2149,2150,2151,2152,2153],{"id":44,"depth":116,"text":2135,"children":2136},"一、this 绑定规则",[2137,2138,2139,2140,2142],{"id":62,"depth":142,"text":63},{"id":163,"depth":142,"text":164},{"id":287,"depth":142,"text":288},{"id":494,"depth":142,"text":2141},"4. new 绑定",{"id":606,"depth":142,"text":2143},"5. 箭头函数的词法 this",{"id":779,"depth":116,"text":780,"children":2145},[2146,2147,2148],{"id":792,"depth":142,"text":793},{"id":957,"depth":142,"text":958},{"id":1058,"depth":142,"text":1059},{"id":1222,"depth":116,"text":1223},{"id":1344,"depth":116,"text":1345},{"id":1652,"depth":116,"text":1653},{"id":1852,"depth":116,"text":1853},{"id":2041,"depth":116,"text":2041},{"title":8,"description":9},"knowledge\u002Fbooklet\u002Fweb\u002FJs\u002Fadvanced","knowledge\u002Fknowledge\u002Fbooklet\u002Fweb\u002FJs\u002Fadvanced.md","md",{"items":2159},[2160,2164,2168,2172,2176,2179],{"path":2161,"title":2162,"description":2163,"category":10,"score":253},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Ferror","错误处理与调试","结构化错误类型、try\u002Fcatch 与全局未捕获处理是健壮应用的基础。",{"path":2165,"title":2166,"description":2167,"category":10,"score":253},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fdom-bom","浏览器相关 API","DOM 事件、存储、fetch、Worker、Observer 等由浏览器提供的 Web API（非 ECMAScript 核心）。HTML 结构见 标签。",{"path":2169,"title":2170,"description":2171,"category":10,"score":253},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fperformance","性能优化","防抖\u002F节流、渲染与内存、资源预加载及引擎行为是前端性能的主要抓手。相关 CSS 见 视觉效果、Head 资源提示。",{"path":2173,"title":2174,"description":2175,"category":10,"score":253},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fcommon","模块化与工程化","ESM、CommonJS 与打包工具（Tree Shaking、代码分割）是前端工程化的基础。入门见 JavaScript 基础 · 模块。",{"path":38,"title":2177,"description":2178,"category":10,"score":253},"执行模型与作用域","执行上下文与词法作用域决定变量在何处可访问、闭包如何形成，以及 var \u002F let \u002F const 的差异。语言概览见 JavaScript 基础。",{"path":2180,"title":2181,"description":2182,"category":10,"score":253},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fmap-set","数据结构与集合增强","Map \u002F Set、WeakMap \u002F WeakSet、数组高阶方法、TypedArray 与 Symbol 等扩展了内置数据结构能力。见 语言基础。",{"series":2184,"title":90,"items":2185,"index":2226,"prev":2227,"next":2228},"booklet\u002Fweb\u002Fjs",[2186,2187,2190,2192,2196,2198,2200,2204,2208,2210,2212,2216,2220,2224],{"path":7,"title":8,"date":14,"pinned":15},{"path":33,"title":2188,"date":2189,"pinned":15},"JavaScript 基础","2023-11-24",{"path":2173,"title":2174,"date":2191,"pinned":15},"2025-06-21",{"path":2193,"title":2194,"date":2195,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fdesign","设计模式","2021-10-05",{"path":2165,"title":2166,"date":2197,"pinned":15},"2025-07-10",{"path":2161,"title":2162,"date":2199,"pinned":15},"2026-06-25",{"path":2201,"title":2202,"date":2203,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fevent-loop","异步编程与事件循环","2020-03-23",{"path":2205,"title":2206,"date":2207,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fexec","正则表达式","2022-05-21",{"path":2180,"title":2181,"date":2209,"pinned":15},"2024-07-10",{"path":2169,"title":2170,"date":2211,"pinned":15},"2025-07-04",{"path":2213,"title":2214,"date":2215,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fprototype","原型与面向对象","2020-04-13",{"path":2217,"title":2218,"date":2219,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fproxy","代理与反射","2022-10-23",{"path":2221,"title":2222,"date":2223,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fsafe","安全","2023-06-26",{"path":38,"title":2177,"date":2225,"pinned":15},"2025-01-29",0,null,{"path":33,"title":2188,"date":2189,"pinned":15}]