主要从以下几个方面考虑: 执行上下文是在执行中确立,而不是声明,如函数分为全局、函数以及eval三种,那么对应了全局函数、eval环境上下文遵循栈的规则,先进后出虽无明确规定,但也遵循堆栈溢出,如: function fn() { fn();}fn();// Uncaught RangeError: Maximum call stack size exceeded function foo () { function bar () { return 'I am bar'; } return bar();}foo(); 上述代码可以大致这么理解: 分为两个阶段: 5.1 准备阶段: a. 函数上下文初始化形参并赋值 b. 初始化arguments并赋值 c. 变量声明(不赋值,见变量提升),字面量函数声明(不赋值) d. this指向(由调用者确定) e. 确定作用域 5.2 执行阶段: a. 变量赋值 b. 字面量函数复制 c. 调用函数 d. 顺序执行代码 面试题: (function (name) { console.log(a); // function console.log(b); // undefined var a = "111"; var b = function () { return "222"; } function a() { return "333"; } console.log(a); // 111})('Jerry') 代码执行阶段分析如下: executionContext = { vo : { arguments : {0 : "Jerry",length : 1}, name : "Jerry", b : undefined, a : function, }, scope : {}, this : {}} 关注微信公众号,解锁更多技术文章 |