跳到主要内容

作用域与执行上下文

一、什么是作用域?

  • 作用域:确定当前执行的代码中变量的访问权限;
  • JS采用词法作用域:变量在被创建时就确定了访问权限,而且在执行阶段

作用域分类

作用域分为:

  • 全局作用域
  • 函数作用域:在函数内创建的变量
  • 块级作用域:在大括号中使用let、const声明的变量,在大括号外无法访问

二、什么是作用域链?

在当前作用域中查找变量,如果找不到,就去父级作用域查找,依次向上级作用域查找,直到全局作用域为止,这一层层的关系就形成作用域链

三、如何理解执行上下文?

执行上下文分为:全局、函数、eval三种

执行上下文的两个阶段

每个执行上下文分2个阶段:

  • 创建阶段:函数被调用,但未执行内部代码之前,这个阶段做了几件事:
    • 确定this指向;
    • 创建变量的词法作用域;
  • 执行阶段:执行函数内部代码

四、this一般有几种调用场景?

var obj = {
a: 1,
b: function() {
console.log(this);
}
};

var b = obj.b;
var c;

function Fun() {
this.a = 1;
this.b = function() {
console.log(this);
}
};

var name = 'window';
var A = {
name: 'A',
sayHello: () => {
console.log(this.name); // sayHello函数所在作用域,为全局作用域,this指向window
}
}
A.sayHello(); // window
  • 作为函数调用 —— b() —— 指向window;
  • 被对象调用 —— obj.b()——指向该对象;
  • 作为构造函数调用 —— var b = new Fun() —— 指向当前实例对象;
  • 使用apply/call/bind改变this指向 —— obj.b.apply(c) —— 指向apply/call/bind后第一个参数对象
  • 箭头函数里的this指向函数所在作用域所指向的对象 —— 全局作用域指向window,函数作用域指向函数

五、什么是闭包?

能够访问自由变量(即不是函数参数,也不是函数内声明的变量)的函数