块级作用域的灵活使用

这篇文章是The JavaScript block statement的读后感。

你有没有遇到过写单元测试时,多个场景多个变量表达同一个意思,但为了避免命名冲突,又不得不想不同名字的场景?

function validatePassword()
{
    //...
}


function testChangePasswordProcess()
{    
    const oldPassword=document.querySelector('.old-password');
    validatePassword(oldPassword);
    
    const newPassword=document.querySelector('new-password');    
    validatePassword(newPassword);
    
    const repeatPassword=document.querySelector('repeat-password');
    validatePassword(repeatPassword);
}

上面的代码没有什么大问题,都是在验证各种场景下的密码,那如果我们想把它们都命名成password要怎样做呢?

function validatePassword()
{
    //...
}


function testChangePasswordProcess()
{    
    const password=document.querySelector('.old-password');
    validatePassword(password);
    
    {
        const password=document.querySelector('new-password');    
        validatePassword(password);
    }

    {
        const password=document.querySelector('repeat-password');
        validatePassword(password);
    }
}

{}可以创建一个块级作用域,在该作用域里的对象只在{}内可见。

在测试用例里使用这个技术我觉得是优雅的,因为{}也可以包裹一整个用例。在生产代码里使用要保持克制,因为它会分割代码块,不易阅读。