我正在为 JavaScript 编写一个静态分析器,我必须在代码的任何位置跟踪所有局部变量。在 JavaScript 中将新的局部变量引入范围的所有方法是什么?
问问题
52 次
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
。- 请注意,变量声明都被解除了。eg
function () { foob(x); var x = 12; }
在功能上等同于function () { var x; foob(x); x = 12; }
- 请注意,变量声明都被解除了。eg
- 函数语句和表达式。这些不仅绑定了参数列表,还创建了一个局部
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 回答