
第三类:保留字 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)定义,那它将保持为 undefined
console.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

