Skip to content

Instantly share code, notes, and snippets.

@wintercn
Created July 21, 2013 14:45
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wintercn/6048758 to your computer and use it in GitHub Desktop.
Save wintercn/6048758 to your computer and use it in GitHub Desktop.
浅谈代码的局部性

我是JS中"就近声明"以及"允许多次var声明"的拥护者。

我持这样观点源自我对易读性的追求。

看一段代码:

function aFunc() {
    for(var i = 0; i < 100; i++) {
        doSth(i);
    }

    var i = k;
}

在这段代码中,i被声明了两次,这样的写法带来的显而易见的好处是,当我的目光分别落到两段代码的时候,我可以立刻意识到i是一个局部变量。反之,看

function aFunc() {
    for(var i = 0; i < 100; i++) {
        doSth(i);
    }
    //...
    //假设这里有很长很长的代码
    i = k;
}

当我读到i = k;的时候,我必须要记住之前i已经被声明过了,我会怀疑这一句是否是在对外层作用域的变量赋值。

增强代码的局部性,可以让读或者维护你的代码的人不需要去记忆或者来回翻找你的函数中的变量声明,而更重要的是,尽管"单一变量声明"被一些愚蠢的代码审查工具列为规则之一,但是我找不到任何这样做的好处。

PS. 一些观点认为,因为JS的声明预处理机制,某引用外部的变量名可能被后面误声明掉,这是一个问题,但是前置变量声明仍然可能被遗忘而犯类似的错误,但是我认为这才是代码审查工具该做的事情,而且就近声明可以让这种错误变得更明显。

var i = 2;
function aFunc() {

    var a = i + 1; //本来这里好好的

    for(var i = 0; i < 100; i++) { //写到这里的时候丝毫没有记住外面还有个i,于是上面一个i变成undefined
        doSth(i);
    }

}
@loskael
Copy link

loskael commented Jul 21, 2013

不能同意更多了~

我的习惯是情愿多敲几个字母, 减少冲突的可能

@be5invis
Copy link

最后一个可以加一个检测 shadowing 的功能,内外层重名提示。
当然形式参数就算了……

@SunLn
Copy link

SunLn commented Jul 21, 2013

就近声明赞同,比如说for循环里面的i、len之类的,放在函数起始部分回看太痛苦,但多次声明同一个变量,接受不了,也许可以声明多个变量试着实现吧。

@ChineseDron
Copy link

我是另一拨,我的习惯是置顶声明,保持婷久了,来回看确实不太方便,说不上有什么好处,只能解释为洁癖了——我非得把 “声明、定义” 前置,“业务逻辑”后置,这样业务代码看起来会显得少一些。

@Gaubee
Copy link

Gaubee commented Jul 21, 2013

我的解决方案是把i写成somethingsItem,不好命名时用foreach

@FrankFang
Copy link

同意 @Gaubee ,我一般把 i 命名为 sthIndex。

@lebang
Copy link

lebang commented Jul 22, 2013

通常你写的文章,我都看不太懂,只是觉得好牛逼的样子。但是这篇文章,怒赞100下。

@zjhiphop
Copy link

其实我对变量的声明有不同的看法,
首先, 单一var声明有以下好处:

  1. 统一管理所有的变量
  2. 避免和全局的变量冲突
    当然, 对于一个var对应一行的声明方式也是可取的。

@Gewin
Copy link

Gewin commented Jul 22, 2013

我是比较喜欢变量就近定义的,阅读起来方便。 但是会报很多waring,让人头疼。

@xinglie
Copy link

xinglie commented Jun 3, 2014

同感

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment