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