在 JavaScript 中引入局部变量的所有方法是什么,它们绑定了什么?

What are all the ways to introduce local variables in JavaScript and what do they bind?

本文关键字:绑定 什么 是什么 有方法 JavaScript 局部变量      更新时间:2023-09-26

我正在为 JavaScript 编写一个静态分析器,我必须在代码的任何点跟踪所有局部变量。在 JavaScript 中将新的局部变量引入范围的所有方法是什么?

函数表达式(而不是函数声明语句)将(可选)函数名称绑定到创建函数内部(但不在外部)的环境。 这是一个测试:

function f1() {
  function f2(n) {
    if (n) {
      f2 = null;
      f2(0);
    }
    else
      console.log("f2");
  }
  f2(1);
  console.log(typeof f2);
}
f1();

这将引发错误,因为使用 null 覆盖"f2"会更新外部 ("f1") 作用域中符号"f2"的值。 现在,这个变体:

function f1() {
  var f2 = function f2(n) {
    if (n) {
      f2 = null;
      f2(0);
    }
    else
      console.log("f2");
  }
  f2(1);
  console.log(typeof f2);
}
f1();

这有效(首先记录"f2",然后记录"函数")。 对"f2"的赋值不会引发错误,但它不会执行任何操作,因为名称"f2"被绑定为范围的不可变属性。 赋值既不影响内部"f2",也不会影响外部"f2"。

以下是我到目前为止确定的所有内容:

  • 标准库包括以下全局变量:Array Boolean Date Function Number Object RegExp String Error EvalError RangeError ReferenceError SyntaxError TypeError URIError decodeURI decodeURIComponent encodeURI encodeURIComponent eval isFinite isNaN parseFloat parseIn Infinity JSON Math NaN undefined
  • 变量声明在作用域中引入变量,例如 var a, b, c, d=4 .
    • 请注意,变量声明都被提升了,例如 function () { foob(x); var x = 12; }在功能上等同于function () { var x; foob(x); x = 12; }
  • 函数语句和表达式。它们不仅绑定参数列表,还创建局部arguments变量。
    • 请注意,函数语句也被提升,例如 function () { funcstatement(12); if (false) { function funcstatement(y) { y + 4; } } }在功能上等同于function () { function funcstatement(y) { y + 4; }; funcstatement(12); if (false) {}; }
  • 命名函数表达式在函数的作用域中引入名称,例如 var x = function name() { /* 'name' available here */ } .
  • try {} catch (e) {}仅在 catch 子句的范围内引入变量e