Baseline Widely available
ç®å¤´å½æ°è¡¨è¾¾å¼çè¯æ³æ¯ä¼ ç»ç彿°è¡¨è¾¾å¼æ´ç®æ´ï¼ä½å¨è¯ä¹ä¸æä¸äºå·®å¼ï¼å¨ç¨æ³ä¸ä¹æä¸äºéå¶ï¼
this
ãarguments
å super
ç»å®ï¼å¹¶ä¸ä¸å¯è¢«ç¨ä½æ¹æ³ãnew
è°ç¨å®ä»¬ä¼å¼å TypeError
ãå®ä»¬ä¹æ æ³è®¿é® new.target
å
³é®åãyield
ï¼ä¹ä¸è½ä½ä¸ºçæå¨å½æ°å建ãconst materials = ["Hydrogen", "Helium", "Lithium", "Beryllium"];
console.log(materials.map((material) => material.length));
// Expected output: Array [8, 6, 7, 9]
è¯æ³
() => expression
param => expression
(param) => expression
(param1, paramN) => expression
() => {
statements
}
param => {
statements
}
(param1, paramN) => {
statements
}
åæ°é¨åæ¯æå©ä½åæ°ãé»è®¤åæ°åè§£æï¼å¹¶ä¸å§ç»éè¦ä½¿ç¨æ¬å·ï¼
(a, b, ...r) => expression
(a = 400, b = 20, c) => expression
([a, b] = [10, 20]) => expression
({ a, b } = { a: 10, b: 20 }) => expression
ç®å¤´å½æ°å¯ä»¥æ¯ async
çï¼æ¹æ³æ¯å¨è¡¨è¾¾å¼åå ä¸ async
å
³é®åã
async param => expression
async (param1, param2, ...paramN) => {
statements
}
æè¿°
让æä»¬éæ¥å°ä¼ ç»çå¿å彿°å解为æç®åçç®å¤´å½æ°ãæ¯ä¸æ¥é½æ¯ä¸ä¸ªææçç®å¤´å½æ°ã
夿³¨ï¼ ä¼ ç»å½æ°è¡¨è¾¾å¼åç®å¤´å½æ°é¤äºè¯æ³ä¸çåºå«å¤ï¼è¿ææ´å¤çä¸åãæä»¬å°å¨æ¥ä¸æ¥çå 个å°èä¸è¯¦ç»ä»ç»å®ä»¬çè¡ä¸ºå·®å¼ã
// ä¼ ç»å¿å彿°
(function (a) {
return a + 100;
});
// 1. ç§»é¤âfunctionâï¼å¹¶å°ç®å¤´æ¾ç½®äºåæ°å彿°ä½èµ·å§å¤§æ¬å·ä¹é´
(a) => {
return a + 100;
};
// 2. ç§»é¤ä»£è¡¨å½æ°ä½ç大æ¬å·åâreturnâââè¿å弿¯éå«ç
(a) => a + 100;
// 3. ç§»é¤åæ°å¨å´çæ¬å·
a => a + 100;
å¨ä¸é¢ç示ä¾ä¸ï¼åæ°å¨å´çæ¬å·å彿°ä½å¨å´ç大æ¬å·é½å¯ä»¥çç¥ã使¯ï¼åªæå¨æäºæ åµä¸æè½çç¥ã
åªæå½å½æ°åªæä¸ä¸ªç®ååæ°æ¶ï¼æè½çç¥æ¬å·ã妿彿°æå¤ä¸ªåæ°ãæ åæ°ãé»è®¤åæ°ãéç»åæ°æå ¶ä½åæ°ï¼åéè¦å¨åæ°å表å¨å´å 䏿¬å·ã
// ä¼ ç»å¿å彿°
(function (a, b) {
return a + b + 100;
});
// ç®å¤´å½æ°
(a, b) => a + b + 100;
const a = 4;
const b = 2;
// ä¼ ç»æ åå¿å彿°
(function () {
return a + b + 100;
});
// æ åç®å¤´å½æ°
() => a + b + 100;
åªæå½å½æ°ç´æ¥è¿åè¡¨è¾¾å¼æ¶ï¼æå¯ä»¥çç¥å¤§æ¬å·ã妿彿°ä½æé¢å¤çå¤çï¼å大æ¬å·æ¯å¿
éçï¼return
å
³é®å乿¯å¿
éçãç®å¤´å½æ°æ æ³çæµå½æ°ä½è¿åä»ä¹æä½æ¶è¿åã
// ä¼ ç»å¿å彿°
(function (a, b) {
const chuck = 42;
return a + b + chuck;
});
// ç®å¤´å½æ°
(a, b) => {
const chuck = 42;
return a + b + chuck;
};
ç®å¤´å½æ°æ»æ¯æªå½åçã妿ç®å¤´å½æ°éè¦è°ç¨èªèº«ï¼è¯·ä½¿ç¨å ·å彿°è¡¨è¾¾å¼ãä¹å¯ä»¥å°ç®å¤´å½æ°èµå¼ç»ä¸ä¸ªåéï¼è¿æ ·å®å°±æäºååã
// ä¼ ç»å½æ°
function bob(a) {
return a + 100;
}
// ç®å¤´å½æ°
const bob2 = (a) => a + 100;
彿°ä½
ç®å¤´å½æ°æ¢å¯ä»¥ä½¿ç¨è¡¨è¾¾å¼ä½ï¼expression bodyï¼ï¼ä¹å¯ä»¥ä½¿ç¨é常çåä½ï¼block bodyï¼ã
å¨è¡¨è¾¾å¼ä½ä¸ï¼åªéæå®ä¸ä¸ªè¡¨è¾¾å¼ï¼å®å°æä¸ºéå¼è¿åå¼ãå¨åä½ä¸ï¼å¿
é¡»ä½¿ç¨æ¾å¼ç return
è¯å¥ã
const func = (x) => x * x;
// 表达å¼ä½è¯æ³ï¼éå«è¿åå¼
const func2 = (x, y) => {
return x + y;
};
// åä½è¯æ³ï¼éè¦æç¡®è¿åå¼
使ç¨è¡¨è¾¾å¼ä½è¯æ³ (params) => { object: literal }
è¿å对象åé¢éæ¶ï¼ä¸è½æé¢æå·¥ä½ã
const func = () => { foo: 1 };
// è°ç¨ func() ä¼è¿å undefinedï¼
const func2 = () => { foo: function () {} };
// SyntaxError: function statement requires a name
const func3 = () => { foo() {} };
// SyntaxError: Unexpected token '{'
è¿æ¯å ä¸ºåªæå½ç®å¤´åé¢çæ è®°ä¸æ¯å·¦æ¬å·æ¶ï¼JavaScript æä¼å°ç®å¤´å½æ°è§ä¸ºè¡¨è¾¾å¼ä½ï¼å æ¤æ¬å·ï¼{}ï¼å
ç代ç ä¼è¢«è§£æä¸ºä¸ç³»åè¯å¥ï¼å
¶ä¸ foo
æ¯æ ç¾ï¼è䏿¯å¯¹è±¡åé¢éä¸çé®ã
è¦è§£å³è¿ä¸ªé®é¢ï¼å¯ä»¥ç¨æ¬å·å°å¯¹è±¡åé¢éå è£ èµ·æ¥ï¼
const func = () => ({ foo: 1 });
ä¸è½ç¨ä½æ¹æ³
ç®å¤´å½æ°è¡¨è¾¾å¼åªè½ç¨äºéæ¹æ³å½æ°ï¼å 为å®ä»¬æ²¡æèªå·±ç this
ã让æä»¬ççå°å®ä»¬ç¨ä½æ¹æ³æ¶ä¼åçä»ä¹ï¼
"use strict";
const obj = {
i: 10,
b: () => console.log(this.i, this),
c() {
console.log(this.i, this);
},
};
obj.b(); // è¾åº undefined, Window { /* ⦠*/ }ï¼æå
¨å±å¯¹è±¡ï¼
obj.c(); // è¾åº 10, Object { /* ⦠*/ }
å¦å¤ä¸ä¸ªç¤ºä¾æ¶åå° Object.defineProperty()
ï¼
"use strict";
const obj = {
a: 10,
};
Object.defineProperty(obj, "b", {
get: () => {
console.log(this.a, typeof this.a, this); // undefined 'undefined' Window { /* ⦠*/ }ï¼æå
¨å±å¯¹è±¡ï¼
return this.a + 10; // 代表å
¨å±å¯¹è±¡ 'Window'ï¼æ
`this.a' è¿å 'undefined'
},
});
ç±äºç±»ä½å
·æ this
ä¸ä¸æï¼å æ¤ä½ä¸ºç±»å段çç®å¤´å½æ°ä¼å
³éç±»ç this
ä¸ä¸æï¼ç®å¤´å½æ°ä½ä¸ç this
å°æ£ç¡®æåå®ä¾ï¼å¯¹äºéæå段æ¥è¯´æ¯ç±»æ¬èº«ï¼ã使¯ï¼ç±äºå®æ¯ä¸ä¸ªéå
ï¼è䏿¯å½æ°æ¬èº«çç»å®ï¼å æ¤ this
çå¼ä¸ä¼æ ¹æ®æ§è¡ä¸ä¸æèæ¹åã
class C {
a = 1;
autoBoundMethod = () => {
console.log(this.a);
};
}
const c = new C();
c.autoBoundMethod(); // 1
const { autoBoundMethod } = c;
autoBoundMethod(); // 1
// å¦æè¿æ¯æ®éæ¹æ³ï¼æ¤æ¶åºè¯¥æ¯ undefined
ç®å¤´å½æ°å±æ§é常被称ä½âèªå¨ç»å®æ¹æ³âï¼å 为å®ä¸æ®éæ¹æ³ççä»·æ§ç¸åï¼
class C {
a = 1;
constructor() {
this.method = this.method.bind(this);
}
method() {
console.log(this.a);
}
}
夿³¨ï¼ ç±»åæ®µæ¯å¨å®ä¾ï¼instanceï¼ä¸å®ä¹çï¼è䏿¯å¨ååï¼prototypeï¼ä¸å®ä¹çï¼å æ¤æ¯æ¬¡å建å®ä¾é½ä¼å建ä¸ä¸ªæ°ç彿°å¼ç¨å¹¶åé ä¸ä¸ªæ°çéå ï¼è¿å¯è½ä¼å¯¼è´æ¯æ®ééç»å®æ¹æ³æ´å¤çå å使ç¨ã
åºäºç±»ä¼¼åå ï¼call()
ãapply()
å bind()
æ¹æ³å¨ç®å¤´å½æ°ä¸è°ç¨æ¶ä¸èµ·ä½ç¨ï¼å 为ç®å¤´å½æ°æ¯æ ¹æ®ç®å¤´å½æ°å®ä¹çä½ç¨åæ¥å»ºç« this
çï¼è this
å¼ä¸ä¼æ ¹æ®å½æ°çè°ç¨æ¹å¼èæ¹åã
ç®å¤´å½æ°æ²¡æèªå·±ç arguments
对象ãå æ¤ï¼å¨æ¬ä¾ä¸ï¼arguments
æ¯å¯¹å¤å±ä½ç¨ååæ°çå¼ç¨ï¼
function foo(n) {
const f = () => arguments[0] + n; // foo çéå¼åæ°ç»å®ãarguments[0] 为 n
return f();
}
foo(3); // 3 + 3 = 6
夿³¨ï¼ å¨ä¸¥æ ¼æ¨¡å¼ä¸ä¸è½å£°æå为 arguments
çåéï¼å æ¤ä¸é¢ç代ç ä¼åºç°è¯æ³é误ãè¿ä½¿å¾ arguments
çèå´æåºæ´å®¹æçè§£ã
å¨å¤§å¤æ°æ
åµä¸ï¼ä½¿ç¨å©ä½åæ°æ¯æ¯ä½¿ç¨ arguments
对象æ´å¥½çéæ©ã
function foo(n) {
const f = (...args) => args[0] + n;
return f(10);
}
foo(1); // 11
ä¸è½ç¨ä½æé 彿°
ç®å¤´å½æ°ä¸è½ç¨ä½æé 彿°ï¼å½ä½¿ç¨ new
è°ç¨æ¶ä¼åºéãå®ä»¬ä¹æ²¡æ prototype
屿§ã
const Foo = () => {};
const foo = new Foo(); // TypeError: Foo is not a constructor
console.log("prototype" in Foo); // false
ä¸è½ç¨ä½çæå¨
ç®å¤´å½æ°ç主ä½ä¸ä¸è½ä½¿ç¨ yield
å
³é®åï¼é¤éå¨ç®å¤´å½æ°è¿ä¸æ¥åµå¥ççæå¨å½æ°ä¸ä½¿ç¨ï¼ãå æ¤ï¼ç®å¤´å½æ°ä¸è½ç¨ä½çæå¨ã
ç®å¤´å½æ°çåæ°åç®å¤´ä¹é´ä¸è½æ¢è¡ã
const func = (a, b, c)
=> 1;
// SyntaxError: Unexpected token '=>'
ä¸ºä¾¿äºæ ¼å¼åï¼å¯å¨ç®å¤´åæ¢è¡ï¼æå¨å½æ°ä½å¨å´ä½¿ç¨æ¬å·/è±æ¬å·ï¼å¦ä¸å¾æç¤ºãä¹å¯ä»¥å¨åæ°ä¹é´æ¢è¡ã
const func = (a, b, c) =>
1;
const func2 = (a, b, c) => (
1
);
const func3 = (a, b, c) => {
return 1;
};
const func4 = (
a,
b,
c,
) => 1;
ç®å¤´çä¼å
级
è½ç¶ç®å¤´å½æ°ä¸çç®å¤´ä¸æ¯è¿ç®ç¬¦ï¼ä½ä¸æ®é彿°ç¸æ¯ï¼ç®å¤´å½æ°å ·æç¹æ®çè§£æè§åï¼ä¸è¿ç®ç¬¦ä¼å 级çäº¤äºæ¹å¼ä¸åã
let callback;
callback = callback || () => {};
// SyntaxError: invalid arrow-function arguments
ç±äº =>
çä¼å
级ä½äºå¤§å¤æ°è¿ç®ç¬¦ï¼å æ¤éè¦ä½¿ç¨æ¬å·æ¥é¿å
callback || ()
被解æä¸ºç®å¤´å½æ°çåæ°å表ã
callback = callback || (() => {});
ç¤ºä¾ ä½¿ç¨ç®å¤´å½æ°
// 空çç®å¤´å½æ°è¿å undefined
const empty = () => {};
(() => "foobar")();
// è¿å "foobar"
// è¿æ¯ä¸ä¸ªç«å³æ§è¡å½æ°è¡¨è¾¾å¼
const simple = (a) => (a > 15 ? 15 : a);
simple(16); // 15
simple(10); // 10
const max = (a, b) => (a > b ? a : b);
// æ´æ¹ä¾¿è¿è¡æ°ç»çè¿æ»¤ãæ å°çå·¥ä½
const arr = [5, 6, 13, 0, 1, 18, 23];
const sum = arr.reduce((a, b) => a + b);
// 66
const even = arr.filter((v) => v % 2 === 0);
// [6, 0, 18]
const double = arr.map((v) => v * 2);
// [10, 12, 26, 0, 2, 36, 46]
// æ´ç®æç promise é¾
promise
.then((a) => {
// â¦
})
.then((b) => {
// â¦
});
// æ åæ°ç®å¤´å½æ°å¨è§è§ä¸å®¹æåæ
setTimeout(() => {
console.log("æåçæ´æ©");
setTimeout(() => {
// æ·±å±æ¬¡ä»£ç
console.log("æåçæ´æ");
}, 1);
}, 1);
ä½¿ç¨ callãbind å apply
call()
ãapply()
å bind()
æ¹æ³ä¸ä¼ ç»å½æ°ä¸æ ·æç
§é¢æå·¥ä½ï¼å 为æä»¬ä¸ºæ¯ä¸ªæ¹æ³å»ºç«äºä½ç¨åï¼
const obj = {
num: 100,
};
// å¨ globalThis ä¸è®¾ç½®ânumâï¼ä»¥æ¾ç¤ºå®å¦ä½æ²¡æè¢«ä½¿ç¨å°ã
globalThis.num = 42;
// 对âthisâè¿è¡æä½çç®åä¼ ç»å½æ°
const add = function (a, b, c) {
return this.num + a + b + c;
};
console.log(add.call(obj, 1, 2, 3)); // 106
console.log(add.apply(obj, [1, 2, 3])); // 106
const boundAdd = add.bind(obj);
console.log(boundAdd(1, 2, 3)); // 106
对äºç®å¤´å½æ°ï¼ç±äºæä»¬ç add
彿°åºæ¬ä¸æ¯å¨ globalThis
ï¼å
¨å±ï¼ä½ç¨åä¸å建çï¼å æ¤å®ä¼åå® this
å°±æ¯ globalThis
ã
const obj = {
num: 100,
};
// å¨ globalThis ä¸è®¾ç½®ânumâï¼ä»¥æ¾ç¤ºå®æ¯å¦ä½è¢«æ¥æ¶å°çã
globalThis.num = 42;
// ç®å¤´å½æ°
const add = (a, b, c) => this.num + a + b + c;
console.log(add.call(obj, 1, 2, 3)); // 48
console.log(add.apply(obj, [1, 2, 3])); // 48
const boundAdd = add.bind(obj);
console.log(boundAdd(1, 2, 3)); // 48
使ç¨ç®å¤´å½æ°çæå¤§å¥½å¤å¯è½æ¯å¨ä½¿ç¨ setTimeout()
å EventTarget.prototype.addEventListener()
çæ¹æ³æ¶ï¼è¿äºæ¹æ³é常éè¦æç§éå
ãcall()
ãapply()
æ bind()
ï¼ä»¥ç¡®ä¿å½æ°å¨éå½çä½ç¨å䏿§è¡ã
对äºä¼ ç»ç彿°è¡¨è¾¾å¼ï¼ç±»ä¼¼è¿æ ·ç代ç å¹¶ä¸è½å颿ç飿 ·å·¥ä½ï¼
const obj = {
count: 10,
doSomethingLater() {
setTimeout(function () {
// æ¤å½æ°å¨ window ä½ç¨å䏿§è¡
this.count++;
console.log(this.count);
}, 300);
},
};
obj.doSomethingLater(); // è¾åºâNaNâï¼å 为âcountâ屿§ä¸å¨ window ä½ç¨åä¸ã
æäºç®å¤´å½æ°ï¼this
ä½ç¨åæ´å®¹æè¢«ä¿çï¼
const obj = {
count: 10,
doSomethingLater() {
// è¯¥æ¹æ³è¯æ³å°âthisâä¸âobjâä¸ä¸æç»å®ã
setTimeout(() => {
// ç±äºç®å¤´å½æ°æ²¡æèªå·±çç»å®ï¼
// è setTimeoutï¼ä½ä¸ºå½æ°è°ç¨ï¼æ¬èº«ä¹ä¸å建ç»å®ï¼
// å æ¤ä½¿ç¨äºå¤é¨æ¹æ³çâobjâä¸ä¸æã
this.count++;
console.log(this.count);
}, 300);
},
};
obj.doSomethingLater(); // è¾åº 11
è§è æµè§å¨å
¼å®¹æ§ åè§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4