其他分享
首页 > 其他分享> > 作用域与上下文

作用域与上下文

作者:互联网

作用域与上下文

由于 JavaScript 语言的特性,函数可以被自由的调用,这种设计模式衍生出 作用域执行上下文(简称上下文)的概念。

全局作用域

全局作用域在页面开启时产生,页面关闭时销毁。其他局部作用域的存在可以避免与全局作用域的命名标识符冲突(局部变量和全局变量)。

函数作用域(局部作用域)

函数作用域于函数调用时生成,执行结束后销毁。

块级作用域(es6)

{} 体内的执行语句,constlet 声明的变量为块级作用域,而 var 声明的变量与 function 声明的函数依旧在其父作用域中。

全局上下文

底层上下文,如浏览器中的 window 对象和 nodejs 中的 global

函数上下文

函数调用的主体。函数存在定义时上下文与运行时上下文,通过callapply改变。

eval 函数的上下文

var x = 1,
  evalg = eval;
function a() {
  var x = 3;
  eval('alert(x)'); //3
  evalg('alert(x)'); //1
}
var x = 1;
(function() {
  (!-[1] ? execScript : eval)('var x = 123;');
})();
console.log(x);

执行栈

执行栈用于存储代码运行时所创建的上下文。与其他语言的调用栈相同,是先进后出的数据结构。

JavaScript 引擎第一次遇到你的脚本时它会创建一个全局上下文并且压入当前执行栈。

当执行函数时引擎为其增加一个新的局部上下文压入栈的顶。

函数执行结束时,该函数上下文从栈中弹出。

上下文的生命周期

  1. 创建阶段:

    • 创建变量对象
    • 建立作用域链
    • 确定 this 指向
  2. 执行阶段:

    • 变量赋值
    • 函数引用
    • 执行代码
  3. 执行完毕

    • 移出执行栈等待回收

变量查找

作用域中的变量查找遵循先局部后全局的规则,当前作用域的变量不存在将在父级函数的作用域查找,依次向上直至顶层作用域。该规则也称为作用域链

闭包

通过一个执行函数返回另一个的自定义函数的程序设计方式。

const getter = (function() {
  let a = 1;
  return function() {
    return a;
  };
})();
getter(); // 1

变量提升(预解析)

指变量、函数的声明被提升至作用域的顶部。

a = 1;
console.log(a);
var a;
//输出为1
var a = 1;
function log() {
  console.log(a);
  var a;
}
_print();
//输出为undefined print函数将变量a的声明提升,取的是函数内a的值
_print();
function _print() {
  console.log('可提升');
}
// 可提升
_print();
var _print = function() {
  console.log('不可提升');
};
//  Uncaught TypeError: _print is not a function
let a = 1;
{
  console.log(a);
  let a;
}
//Uncaught ReferenceError: Cannot access 'a' before initialization

标签:function,函数,作用域,var,上下文,变量
来源: https://www.cnblogs.com/qingzhao/p/16560913.html