关于JavaScript的一些概念

186 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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绑定取决于外层(函数或全局)作用域