You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
(function (a, b) {
console.log(a, b)
var a;
function b() {};
a = 1;
console.log(a, b)
})(3, 4)
output:
3 [Function: b]
1 [Function: b]
伪代码转换:
(function (a, b) {
var a=3,b=4;
b=function () {}
console.log(a, b)
a = 1;
console.log(a, b)
})(3, 4)
var x = 0;
function f(x = x) { // A行
console.log(x)
console.log(y) // B行
let y = 1;
}
f()
output:
ReferenceError: x is not defined
ReferenceError: y is not defined
前言
前面的一篇博客《JS运行原理》,已经大致讲解过“执行上下文”。这篇博客计划详细说说这个概念。
定义
我们一般把JS引擎运行JS代码分为两步,
执行上下文确定了第二步需要用的变量(或者说是寻找变量的途径),如果在执行代码的时候无法确定变量将会报错
ReferenceError
,不包括变量为undefined和null的情况。执行上下文主要包括三个重要属性:
这篇博客涉及到的概念
执行上下文栈
JS引擎刚开始读取JS文件的时候,会创建一个全局上下文,并把它放到执行上下文栈里,之后如果遇到需要新创建执行上下文,会把它压到栈顶;直到相关的代码执行完毕并返回结果,该执行上下文会被出栈。执行上下文栈是创建作用域链的重要参考。
提升(Hoisting)
提升是相对于var声明的变量和函数声明的,函数表达式并不会被提升。
提升的伪逻辑如下:
变量对象
全局执行上下文的变量对象有:
new Date
,本身就是Window.Date)函数执行上下文的变量对象有:
作用域链
当在本执行上下文中的变量对象中没有找到目标变量的话,就会借助作用域来查找变量。
比如:在函数执行上下文中未使用var定义的变量被调用的时候,因为在变量对象中找不到,所以会顺着作用域链查找下一个执行上下文中的变量对象。
作用域链是根据执行上下文栈来确定的。
计算this的指向
一旦确定了this的指向,当访问this的某个成员变量或函数,如果不存在不会根据执行上下文栈找到上一个this并查询。
1. 全局执行上下文
this指向全局对象,在浏览器环境下是window,在nodejs下是global
2. 函数执行上下文
fun()
而不是obj.fun()
,this指向全局对象,但是在严格模式下,会指向undefined3. 特殊情况
暂时性死区
只有在es6中的let和const才会发生这种情况。
参考链接
http://yanhaijing.com/javascript/2014/04/29/what-is-the-execution-context-in-javascript/
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/eval
https://www.cnblogs.com/snandy/archive/2011/03/19/1988284.html
http://blog.csdn.net/yangbingbinga/article/details/61424363
The text was updated successfully, but these errors were encountered: