
第三類:保留字 Token (不同語言的詞法分析主要是這里不同)
第四類:界符 ‘/*’、‘//’、 () { } [ ] " " ' 等
第五類:運算符 <、<=、>、>=、=、+、-、*、/、^、等
MDN里可以查詢各種語義的使用方式 (關於具體語法的使用,建議查看權威網站,比如MDN,W3等)
https://stackoverflow.com/questions/21724326/what-is-the-motivation-for-bringing-symbols-to-es6
https://stackoverflow.com/questions/49615962/what-is-the-use-of-symbol-in-javascript-ecmascript-6
Symbol還可以用來實現迭代器List和Record: 用於描述函數傳參過程
Set: 主要用於解釋字符集等
Completion Record: 用於描述異常、跳出等語句執行過程
Reference: 用於描述對象屬性訪問、delete等
Property Descriptor: 用於描述對象的屬性
Lexical Environment和Environment Record: 用於描述變量和作用域
Data Block: 用於描述二進制數據
console.log(Object.prototype.toString.call(o)); //[object String]
裝箱機制會頻繁產生臨時對象,在一些對性能要求較高的場景下,我...
極客時間版權所有: https://time.geekbang.org/column/article/78884
Object.defineProperty(o, "b", {value: 2, writable: false, enumerable: false, configurable: true});
//a 和 b 都是數據屬性,但特征值變化了
Object.getOwnPropertyDescriptor(o,"a"); // {value: 1, writable: true, enumerable: true, configurable: true}
Object.getOwnPropertyDescriptor(o,"b"); // {value: 2, writable: false, enumerable: false, configurable: true}
o.b = 3;
console.log(o.b); // 2
say(){
console.log("meow~");
},
jump(){
console.log("jump");
}
}
var tiger = Object.create(cat, {
say:{
writable:true,
configurable:true,
enumerable:true,
value:function(){
console.log("roar!");
}
}
})
var anotherCat = Object.create(cat);
anotherCat.say();
var anotherTiger = Object.create(tiger);
anotherTiger.say();
function c1(){
this.p1 = 1;
this.p2 = function(){
console.log(this.p1);
}
}
var o1 = new c1;
o1.p2();
}
c2.prototype.p1 = 1;
c2.prototype.p2 = function(){
console.log(this.p1);
}
var o2 = new c2;
o2.p2();
constructor(name,age) {
this.name = name;
this.age = age;
}
get area() {
return this.name;
}
sayHelloToRex() {
console.log("hello Rex");
}
}
var rex = new Rex('Wang Chen Long',36);
rex.sayHelloToRex();
console.log(rex.area);
比如 document.createElement 就可以創...
極客時間版權所有: https://time.geekbang.org/column/article/80011
<script>
document.write("<p>我的第一段 JavaScript</p>");
</script>
[Function: isFinite]
[Function: isNaN]
[Function: parseFloat]
[Function: parseInt]
[Function: decodeURI]
[Function: decodeURIComponent]
[Function: encodeURI]
[Function: encodeURIComponent]
[Function: Array]
[Function: Date]
[Function: RegExp]
[Function: Promise]
[Function: Proxy]
[Function: Map]
[Function: WeakMap]
[Function: Set]
[Function: WeakSet]
[Function: Function]
[Function: Boolean]
[Function: String]
[Function: Number]
[Function: Symbol]
[Function: Object]
{ [Function: Error] stackTraceLimit: 10 }
[Function: EvalError]
[Function: RangeError]
[Function: ReferenceError]
[Function: SyntaxError]
[Function: TypeError]
[Function: URIError]
[Function: ArrayBuffer]
[Function: SharedArrayBuffer]
[Function: DataView]
[Function: Float32Array]
[Function: Float64Array]
[Function: Int8Array]
[Function: Int16Array]
[Function: Int32Array]
[Function: Uint8Array]
[Function: Uint16Array]
[Function: Uint32Array]
[Function: Uint8ClampedArray]
Object [Atomics] {}
Object [JSON] {}
Object [Math] {}
{}
[]
[Function: isArray]
[Function: from]
[Function: of]
Date {}
[Function: now]
[Function: parse]
[Function: UTC]
RegExp {}
[Function: get input]
[Function: set input]
[Function: get $_]
[Function: set $_]
[Function: get lastMatch]
[Function: set lastMatch]
[Function: get $&]
[Function: set $&]
[Function: get lastParen]
[Function: set lastParen]
[Function: get $+]
[Function: set $+]
[Function: get leftContext]
[Function: set leftContext]
[Function: get $`]
[Function: set $`]
[Function: get rightContext]
[Function: set rightContext]
[Function: get $']
[Function: set $']
[Function: get $1]
[Function: set $1]
[Function: get $2]
[Function: set $2]
[Function: get $3]
[Function: set $3]
[Function: get $4]
[Function: set $4]
[Function: get $5]
[Function: set $5]
[Function: get $6]
[Function: set $6]
[Function: get $7]
[Function: set $7]
[Function: get $8]
[Function: set $8]
[Function: get $9]
[Function: set $9]
Promise {}
[Function: all]
[Function: race]
[Function: resolve]
[Function: reject]
[Function: revocable]
Map {}
WeakMap {}
Set {}
WeakSet {}
[Function]
[Boolean: false]
[String: '']
[Function: fromCharCode]
[Function: fromCodePoint]
[Function: raw]
[Number: 0]
[Function: isFinite]
[Function: isInteger]
[Function: isNaN]
[Function: isSafeInteger]
Symbol {}
[Function: for]
[Function: keyFor]
{}
[Function: assign]
[Function: getOwnPropertyDescriptor]
[Function: getOwnPropertyDescriptors]
[Function: getOwnPropertyNames]
[Function: getOwnPropertySymbols]
[Function: is]
[Function: preventExtensions]
[Function: seal]
[Function: create]
[Function: defineProperties]
[Function: defineProperty]
[Function: freeze]
[Function: getPrototypeOf]
[Function: setPrototypeOf]
[Function: isExtensible]
[Function: isFrozen]
[Function: isSealed]
[Function: keys]
[Function: entries]
[Function: values]
Error {}
[Function: captureStackTrace]
[EvalError]
[RangeError]
[ReferenceError]
[SyntaxError]
[TypeError]
[URIError]
ArrayBuffer {}
[Function: isView]
SharedArrayBuffer {}
DataView {}
Float32Array {}
Float64Array {}
Int8Array {}
Int16Array {}
Int32Array {}
Uint8Array {}
Uint16Array {}
Uint32Array {}
Uint8ClampedArray {}
[Function: load]
[Function: store]
[Function: add]
[Function: sub]
[Function: and]
[Function: or]
[Function: xor]
[Function: exchange]
[Function: compareExchange]
[Function: isLockFree]
[Function: wait]
[Function: wake]
[Function: notify]
[Function: parse]
[Function: stringify]
[Function: abs]
[Function: acos]
[Function: acosh]
[Function: asin]
[Function: asinh]
[Function: atan]
[Function: atanh]
[Function: atan2]
[Function: ceil]
[Function: cbrt]
[Function: expm1]
[Function: clz32]
[Function: cos]
[Function: cosh]
[Function: exp]
[Function: floor]
[Function: fround]
[Function: hypot]
[Function: imul]
[Function: log]
[Function: log1p]
[Function: log2]
[Function: log10]
[Function: max]
[Function: min]
[Function: pow]
[Function: random]
[Function: round]
[Function: sign]
[Function: sin]
[Function: sinh]
[Function: sqrt]
[Function: tan]
[Function: tanh]
[Function: trunc]
[Function: defineProperty]
[Function: deleteProperty]
[Function: apply]
[Function: construct]
[Function: get]
[Function: getOwnPropertyDescriptor]
[Function: getPrototypeOf]
[Function: has]
[Function: isExtensible]
[Function: ownKeys]
[Function: preventExtensions]
[Function: set]
[Function: setPrototypeOf]
[Function: concat]
[Function: find]
[Function: findIndex]
[Function: pop]
[Function: push]
[Function: shift]
[Function: unshift]
[Function: slice]
[Function: splice]
[Function: includes]
[Function: indexOf]
[Function: keys]
[Function: entries]
[Function: forEach]
[Function: filter]
[Function: map]
[Function: every]
[Function: some]
[Function: reduce]
[Function: reduceRight]
[Function: toString]
[Function: toLocaleString]
[Function: join]
[Function: reverse]
[Function: sort]
[Function: lastIndexOf]
[Function: copyWithin]
[Function: fill]
[Function: values]
[Function: toString]
[Function: toDateString]
[Function: toTimeString]
[Function: toISOString]
[Function: toUTCString]
[Function: getDate]
[Function: setDate]
[Function: getDay]
[Function: getFullYear]
[Function: setFullYear]
[Function: getHours]
[Function: setHours]
[Function: getMilliseconds]
[Function: setMilliseconds]
[Function: getMinutes]
[Function: setMinutes]
[Function: getMonth]
[Function: setMonth]
[Function: getSeconds]
[Function: setSeconds]
[Function: getTime]
[Function: setTime]
[Function: getTimezoneOffset]
[Function: getUTCDate]
[Function: setUTCDate]
[Function: getUTCDay]
[Function: getUTCFullYear]
[Function: setUTCFullYear]
[Function: getUTCHours]
[Function: setUTCHours]
[Function: getUTCMilliseconds]
[Function: setUTCMilliseconds]
[Function: getUTCMinutes]
[Function: setUTCMinutes]
[Function: getUTCMonth]
[Function: setUTCMonth]
[Function: getUTCSeconds]
[Function: setUTCSeconds]
[Function: valueOf]
[Function: getYear]
[Function: setYear]
[Function: toJSON]
[Function: toLocaleString]
[Function: toLocaleDateString]
[Function: toLocaleTimeString]
[Function: exec]
[Function: get dotAll]
[Function: get flags]
[Function: get global]
[Function: get ignoreCase]
[Function: get multiline]
[Function: get source]
[Function: get sticky]
[Function: get unicode]
[Function: compile]
[Function: toString]
[Function: test]
[Function: then]
[Function: catch]
[Function: finally]
[Function: get]
[Function: set]
[Function: has]
[Function: delete]
[Function: clear]
[Function: entries]
[Function: forEach]
[Function: keys]
[Function: get size]
[Function: values]
[Function: delete]
[Function: get]
[Function: has]
[Function: set]
[Function: has]
[Function: add]
[Function: delete]
[Function: clear]
[Function: entries]
[Function: forEach]
[Function: get size]
[Function: values]
[Function: delete]
[Function: has]
[Function: add]
[Function]
[Function: apply]
[Function: bind]
[Function: call]
[Function: toString]
[Function: toString]
[Function: valueOf]
[Function: anchor]
[Function: big]
[Function: blink]
[Function: bold]
[Function: charAt]
[Function: charCodeAt]
[Function: codePointAt]
[Function: concat]
[Function: endsWith]
[Function: fontcolor]
[Function: fontsize]
[Function: fixed]
[Function: includes]
[Function: indexOf]
[Function: italics]
[Function: lastIndexOf]
[Function: link]
[Function: localeCompare]
[Function: match]
[Function: normalize]
[Function: padEnd]
[Function: padStart]
[Function: repeat]
[Function: replace]
[Function: search]
[Function: slice]
[Function: small]
[Function: split]
[Function: strike]
[Function: sub]
[Function: substr]
[Function: substring]
[Function: sup]
[Function: startsWith]
[Function: toString]
[Function: trim]
[Function: trimStart]
[Function: trimEnd]
[Function: toLowerCase]
[Function: toUpperCase]
[Function: valueOf]
[Function: toLocaleLowerCase]
[Function: toLocaleUpperCase]
[Function: toExponential]
[Function: toFixed]
[Function: toPrecision]
[Function: toString]
[Function: valueOf]
[Function: toLocaleString]
[Function: toString]
[Function: valueOf]
[Function: __defineGetter__]
[Function: __defineSetter__]
[Function: hasOwnProperty]
[Function: __lookupGetter__]
[Function: __lookupSetter__]
[Function: isPrototypeOf]
[Function: propertyIsEnumerable]
[Function: toString]
[Function: valueOf]
[Function: get __proto__]
[Function: set __proto__]
[Function: toLocaleString]
[Function: toString]
[Function: get byteLength]
[Function: slice]
[Function: get byteLength]
[Function: slice]
[Function: get buffer]
[Function: get byteLength]
[Function: get byteOffset]
[Function: getInt8]
[Function: setInt8]
[Function: getUint8]
[Function: setUint8]
[Function: getInt16]
[Function: setInt16]
[Function: getUint16]
[Function: setUint16]
[Function: getInt32]
[Function: setInt32]
[Function: getUint32]
[Function: setUint32]
[Function: getFloat32]
[Function: setFloat32]
[Function: getFloat64]
[Function: setFloat64]
[Function: getBigInt64]
[Function: setBigInt64]
[Function: getBigUint64]
[Function: setBigUint64]
wake {}
notify {}

函數對象的定義是:具有[[call]]私有字段的對象,具有[[construct]]私有字段的對象
JavaScript 用對象模擬函數的設計代替了一般編程語言的函數,它們可以像其他語言的函數一樣被調用,傳參。任何宿主只要提供了“具有[[call]]私有字段的對象”,就可以被JavaScript函數調用語法支持。
在ES3和更早的版本中,JavaScript本身還沒有異步執行代碼的能力,當宿主環境傳遞給JavaScript引擎一段代碼,引擎就把代碼直接順次執行了,這個任務也就是宿主發起的任務。在ES5之后,JavaScript引入了Promise, 這樣,不需要瀏覽器的安排,JavaScript引擎本身也可以發起任務了。
函數的調用方可以在合適的時機,選擇等待這個承諾兌現(通過Promise的then方法的回調)
function sleep(duration) { return new Promise(function(resolve, reject){ setTimeout(resolve,duration); }); } sleep(3000).then(()=> console.log('finished'));
NodeJS中的process.nextTick方法可以在當前"執行棧"的尾部----下一次Event Loop(主線程讀取"任務隊列")之前----觸發回調函數。也就是說,它指定的任務總是發生在所有異步任務之前。setImmediate方法則是在當前"任務隊列"的尾部添加事件,也就是說,它指定的任務總是在下一次Event Loop時執行,這與setTimeout(fn, 0)很像
根據JSC引擎的術語, 宿主發起的叫做宏觀任務,JavaScript引擎本身發起的叫做微觀任務。
在JS引擎底層的C/C++代碼中,事件循環是一個跑在獨立線程中的循環,
while(true) {
r = wait();
execute(r);
}
整個循環做的事情基本上就是反復“等待-執行”。
setTimeout(()=>console.log("d"), 0);
var r = new Promise(function(resolve, reject){
console.log("a"); /*雖然這句寫在Promise中,但它不是異步代碼, 不會添加到任務隊列中 */
resolve();
});
r.then(() => console.log("c"));
console.log("b");
setTimeout(()=>console.log("d"), 0);
var r = new Promise(function(resolve, reject){
resolve()
});
r.then(() => {
console.log("c1");
new Promise(function(resolve, reject){
resolve()
}).then(setTimeout(()=>console.log("c2"),0));
});
<script> $(document).ready(function(){ function changeTrafficLight(color, duration) { return new Promise(function(resolve, reject) { document.getElementById("traffic-light").style.backgroundColor = color; setTimeout(resolve, duration); }) } async function trafficScheduler() { await changeTrafficLight("green", 3000); await changeTrafficLight("yellow", 1000); await changeTrafficLight("red", 2000); trafficScheduler(); } trafficScheduler(); }); </script>
我們可以這樣簡單理解一下,閉包其實只是一個綁定了執行環境的函...
極客時間版權所有: https://time.geekbang.org/column/article/83302
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures
環境:函數的詞法環境(執行上下文的一部分)
標識符列表:函數中用到的未聲明的變量

class animal { constructor(name) { this.name = name; } } class dog extends animal { constructor(name){ this.name = name } } function createEatFunction() { var desc = " is eating"; return function eat(animal){ console.log(animal.name+desc); }; } var eat = createEatFunction(); //全局變量 var desc = "正在吃東西"; eat(dog); //這里輸出什么?

// code
}
2) 箭頭函數
// code
}
foo(){
//code
}
}
// code
}
constructor(){
//code
}
}
// code
}
const foo = async () => {
// code
}
async function foo*(){
// code
}
lexical: 表示從上下文中找this, 這對應了箭頭函數
global:表示當this為undefined時,取全局對象,對應了普通函數
strict:當嚴格模式時使用,this嚴格按照調用時傳入的值,可能為null或者undefined
this 都指向全局對象。this的值取決於函數被調用的方式。this 的值不是由該調用設置的,所以 this 的值默認指向全局對象。this 沒有被執行環境(execution context)定義,那它將保持為 undefinedconsole.log(this);
}
var o = {
showThis: showThis
}
showThis(); // global
o.showThis(); // o
console.log(this);
}
var o = {
showThis: showThis
}
showThis(); // global
o.showThis(); // global
showThis() {
console.log(this);
}
}
var o = new C();
var showThis = o.showThis;
showThis(); // undefined
o.showThis(); // C的實例o
當一個函數執行時,會創建一條新的執行環境記錄,記錄的外層詞法環境會被設置成函數的[[Environment]]
// 這是 foo.js 文件里的代碼
var b = 2;
module.exports = function() { // 導出function
console.log(b);
console.log(a);
};
```
```js
// 這是test.js 文件里的代碼
var foo = require("./foo.js"); // 引入function 為foo
var a = 1;
foo();
// node 執行 test.js 輸出:
// -> 2
// -> ReferenceError: a is not defined

console.log(this);
console.log(a, b, c);
}
foo.call({}, 1, 2, 3);
foo.apply({}, [1, 2, 3]);
try{
return 0;
} catch(err) {
} finally {
console.log("a")
}
}
console.log(foo());
JavaScript 正是依靠語句的 Completion ...
極客時間版權所有: https://time.geekbang.org/column/article/83860

