作用域与执行上下文
一、什么是作用域?
- 作用域:确定当前执行的代码中变量的访问权限;
- 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,函数作用域指向函数
五、什么是闭包?
能够访问自由变量(即不是函数参数,也不是函数内声明的变量)的函数