functiona() { var variableInA = 'A variable in [[scope A]]';
newPromise((res, rej) => { setTimeout(() => { res('pass after setTimeout with 1000ms'); }, 1000); }).then((data) => { console.log('data in then: ', data, 'variableInA is:', variableInA); }); }
从函数的角度来说,执行 a () 是一个同步的运行方式,运行完 new Promise ().then () 之后就会将 a () 创建的环境销毁(没有闭包的情况下)。我之前所理解的闭包是函数 a 运行返回一个函数 b,函数 b 中保持了 a 中的变量引用,那么函数 a 所创建的环境就不会被销毁(我也不太清楚是被引用的变量不会被销毁,还是说所有都不会 更新:2018-11-01 17:26:28:只有被引用了的才会产生闭包,应该是在执行前解释的时候决定的。但是讲道理只保留被引用的变量能最大程度地节省内存,不过对 gc 的要求就更多,需要去判断哪些被引用,哪些被间接地引用等等,chrome 的 V8 貌似属于只保留引用变量的那种)
从上面两图来看,前图是只引用了一个变量 a,所以闭包中只有 a;后图中 a 是一个函数,引用了变量对象中的 b,所以 fn 函数的闭包中既有 a 又有 b。验证成功。大家可自行把玩 chrome 的 source 面板。
回到主题,这里的 Promise 并不是被返回的,而只是一个执行的步骤,但确实保留了对 a 创建的 variableInA 的引用,成为了所谓的闭包。不解。so 开始学习。
Symbol 主要作用是防止对象的属性被无意地覆盖。通过保留对 let a = Symbol () 的引用,可以访问 obj [a]。通过使用 Symbol.for () 和 Symbol.keyFor (),方便对属性值的存取。有几个小地方需要注意,在使用 instanceof 的时候,首先会调用对象的 [Symbol.hasInstance] 方法,for of 循环调用的是对象的 [Symbol.iterator] 方法。
Promise
1 2 3 4 5 6 7 8 9 10 11
asyncfunctiontest(){ if (Math.random !== 0.5) { return1; }
var b = awaitnewPromise((res, rej)=> { res(999) }) return b; } // 我就想故意返回1,哈哈哈