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

时间:2013-09-24 21:53:07

标签: javascript variables local static-analysis

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

2 个答案:

答案 0 :(得分:1)

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

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”。

答案 1 :(得分: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
    • 请注意,变量声明全部解除。例如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