持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情
JavaScript词法作用域和动态作用域
词法作用域即静态作用域(js采用得就是词法作用域):函数的作用域在函数定义的时候就决定了。
动态作用域(bash就是):函数作用域是在函数调用的时候才决定的。
如何理解呢?如下例子:
var num=18;
function Printage(){
console.log(num);
}
function xiaomingAge(){
var num = 19;
Printage();
}
xiaomingAge();
那么上面一段js代码中,会打印出的小明的年纪是多少呢?如果根据静态作用域,就会打印18;
JavaScript执行上下文
JavaScript 引擎创建了执行上下文栈来管理执行上下文。
当JavaScript代码执行一段可执行代码时,会创建对应的执行上下文。
对于每个执行上下文,都有三个重要属性:
变量对象
作用域链
This
JavaScript作用域和作用域链
作用域:是指程序源代码中定义变量的区域,规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。
作用域链:当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一致找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做作用域链。
this
this是JavaScript的一个关键字,函数调用时才会出现。但是this会根据不同的调用场景,有不同的取值
| 场景 | 描述 |
|---|---|
| 普通函数的调用 | 非严格模式:this指向的是window;严格模式this指向的是undefined |
| 对象方法的调用 | this指的是该对象,且是最近的对象 |
| 构造函数的调用 | this指的是实例化的新对象 |
| apply和call调用 | this指向参数中的对象 |
| 匿名函数的调用 | this指向的是全局对象window |
| 定时器中的调用 | this指向的是全局变量window |
| 箭头函数的调用 | this绑定取决于外层(函数或全局)作用域 |