0

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

4

2 回答 2

1

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

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

f1();

这将引发错误,因为用null更新外部(“f1”)范围内的符号“f2”的值覆盖“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”,然后是“function”)。对“f2”的赋值不会引发错误,但它不会做任何事情,因为名称“f2”被绑定为范围的不可变属性。赋值既不影响内部“f2”也不影响外部“f2”。

于 2013-09-24T22:33:28.140 回答
0

以下是我迄今为止确定的所有内容:

  • 标准库包括以下全局变量: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
    • 请注意,变量声明都被解除了。egfunction () { 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) {}e仅在 catch 子句的范围内引入变量。
于 2013-09-24T21:53:07.430 回答