Open xxleyi opened 4 years ago
// es6 let p1 = p2 = 1 let callable = () => p2 = p2 + 1 function functionParamScope(p1 = () => p1, p2 = () => p2, p3 = 3 + callabe()){ var p1 = p2() var p2 = p1() var p3 } function blockScope() { const r = [] for (let i = 0; i < 3; i++){ r.push(() => i) } for (var i = 0; i < 3; i++){ r.push(() => i) } }
compiled to es5
// es5 var p1 = p2 = 1; var callable = function callable() { return p2 = p2 + 1; }; function functionParamScope() { var p1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () { return p1; }; var p2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () { return p2; }; var p3 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 3 + callabe(); return function (p1, p2) { var p1 = p2(); var p2 = p1(); }(p1, p2); } function blockScope() { var r = []; var _loop = function _loop(_i) { r.push(function () { return _i; }); }; for (var _i = 0; _i < 3; _i++) { _loop(_i); } for (var i = 0; i < 3; i++) { r.push(function () { return i; }); } }
值得留意的是:
arguments
var p1 = p2()
let p1 = 1000
var p3
compiled to es5
值得留意的是:
arguments
var p1 = p2()
这种向后兼容行为会导致闭包 (这意味着函数默认参数有自己单独的作用域)let p1 = 1000
这种会报错var p3
直接被忽略 (特定的行为)