如何轻松地将在不同范围内重复的所有变量名称重命名为不同的名称?
e.g。来自
var a=1;
for (var i=0;i<5;i++){
var a=2;
console.log(a+i);
}
到
var a=1;
for (var i=0;i<5;i++){
var a1=2;
console.log(a1+i);
}
答案 0 :(得分:2)
let
使用let
:
var a=1;
for (var i=0;i<5;i++){
let a=2;
^^^
console.log(a+i);
}
现在,循环中的a
是&#34;范围&#34;循环,与外部a
不同。
来自MDN:
let
允许您将范围有限的变量声明为使用它的块,语句或表达式。这与var
关键字不同,grasp 'for #a' -R a1 ~/tmp/grasp.js
关键字全局定义变量,或者无论块范围如何,都在本地定义整个函数。
由于这是ES6,截至撰写本文时,除非您使用Chrome,IE&gt; = 11或节点,否则您将需要使用像babel这样的转发器。
您还可以考虑使用类似抓取的工具:http://www.graspjs.com/blog/2014/01/07/refactoring-javascript-with-grasp/。掌握后,您可以轻松缩小变更范围,因此在这种情况下您可以使用
a
这限制了变量for
在{{1}}循环内的变化。
此外,一些编辑/ IDE有一个&#34;重构&#34;命令,如果您想要重命名变量,这可能会有所帮助。查看IDE的文档。
如果您真的有兴趣将在各种块作用域中重新声明的所有变量重命名为唯一,那么您需要使用像esprima这样的解析器来编写一个小程序来解析代码和自己修改;还有一些工具是在esprima之上编写的,可以让你更容易做到这一点。听起来比实际更难。
答案 1 :(得分:0)
是否有任何软件包(可能是npm)可以帮助将在不同范围内重复的所有变量名重命名为不同的名称?
不,没有。
您可能想要做的是创建自己的计数器,然后单独查看变量的范围,但是解析器可能存在很多问题,因为有很多方法可以声明/定义/初始化变量:
class Foo;
struct FooVtable {
void bar(Foo* foo)
{
//Foo *ptr = new Foo; //Why does this throw error as No Default constructor?
cout<"FooVTable : bar"; //Doesnt get printed even though gets called
}
};
struct Foo {
FooVtable* vptr;
void bar(Foo *foo)
{
cout<<"Foo : bar";
}
};
int callSomeFun(Foo* foo) {
foo->vptr->bar(foo);
return 0;
}
int main()
{
Foo *ptr=new Foo;
callSomeFun(ptr);
return 0;
}