Skip to content

Instantly share code, notes, and snippets.

@wintercn
Created July 21, 2013 14:45
Show Gist options
  • 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);
    }

}
@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