从一盗窃案看javascript变量作用域的重要性

当雷斯垂德警察局长看到报警银行的电脑代码时,他立即给神探福尔摩斯打电话说“犯人用流氓代码盗走了银行1250美金……”,接着便把代码发给了福尔摩斯。而福尔摩斯看了一下代码,便告知雷斯垂德警长说“这个案件不用侦查了。因为罪犯犯了一个致命的错误,根本不可能把钱偷走”。

下面图片中的代码就是雷斯警长给福尔摩斯看的代码

图片发自App

请大家想一想这段代码有什么问题呢?福尔摩斯为什么看一眼就知道罪犯根本不可能把钱偷走呢?请看下图中我做的解释:

图片发自App


其实,正如我在上面图片中给出的答案那样:本案中罪犯犯了用javascript函数的局部变量遮住了全局变量的错误,这样他就无法改变银行账户的实际余额,也就无法完成金额的划转交易。同时,他把重新打开监控的代码放在了函数返回之后,也就无法重启监控了,这样就给银行发现盗窃行为提供了及时的线索。因为函数一旦返回,就不再执行后面的代码。

所以,javascript中,函数变量的作用域是无足轻重的。那么,大家怎样才能理解和掌握js函数变量的作用域呢?

这就要求我们一定要弄明白全局变量和局部变量的差别。即:如果变量是在函数外部声明的,它就是全局变量;如果变量是在函数中声明的,它就是局部变量。

同时,应特别注意以下几种情况:①形参是局部变量;②凡在函数中没有声明的变量,都被自动视为全局变量。所以,千万不要忘记声明局部变量。这是因为,忘记声明局部变量可能会带来麻烦,即:如果使用了同名的全局变量,就可能会修改并非你要修改的值,也就可能带来重大灾难或损失。③形参中应避免使用同全局变量同名的变量,否则,它会遮住全局变量,就像本案例中的情形一样。这种情况有时会与自己真实的意图相佐。

理解了局部变量和全局变量,它们的作用域也就相应明白了。因为变量的定义位置决定了其作用域,即变量在代码的哪些地方可见,哪些地方不可见。换句话说,就是在函数外定义的变量的作用域为全局,而在函数中定义的变量的作用域为局部。

理解了变量的作用域,我们才能更好地理解和使用闭包。因为闭包的核心在于自由变量和产产生自由变量的环境,而其自由变量的思想来源于线性矩阵的自由变量,因而具有极高的安全性。如果把一段代码比喻为一座城市,那么全局变量就好比城市大街上的挂牌公司,谁都可以见到;局部变量就像城中某个小巷中的公司,只有相关人员才能看到;而闭包呢,它就像城市中的地下机构,外界对它的了解几乎是黑箱。

你可能感兴趣的:(从一盗窃案看javascript变量作用域的重要性)