. 一个变量的作用域 (score) 是程序源代码整这个变量的作用域. 全局变量永远有全局作用域, 在 javascirpt 代码中的任何地方都是有定义的. 然而在函数内声明变量只正在函数体有定义. 他们是局部变量, 作用域是局部性的. 函数参数也是局部变量, 他们只在函数体内有定义.
在函数体内, 局部变量优先于高于同名的全局变量. 如果函数体内声明一个局部变量或者函数参数有变量和全局变量重名, 那么全局变量会被局部变量覆盖. 代码如下
- var scope = 'global'; // 声明一个变量
- function checkscope(){
- var scope = 'local'; // 声明一个同名的局部变量
- return scope; // 返回局部变量的值, 而不是全局变量的值
- }
- checkscope() //=>"local"
尽管在全局作用域编写代码可以不写 var 语句, 但声明局部变量时必须使用 var 语句. 思考一下如果不这样会怎么样:
- scope = "global"; // 声明一个全局变量, 甚至不用 var 声明
- function checkscope2(){
- scope = "locel"; // 糟糕! 我们刚修改了全局变量
- myscope = "locel"; // 这里显示的声明了一个新的全局变量
- return [scope, myscope]; // 返回两个值
- }
- checkscope2() //=>["locel","locel"]
- scope //=>"locel": 全局变量修改了
- myscope //=>"locel": 全局命名空间搞乱了
函数定义是可以嵌套的. 由于每个函数都有它自己的作用域, 因此会出现几个局部作用域嵌套的情况, 列如:
- var scope = "global scope"; // 全局变量
- function checkscope(){
- var scope = "local scope"; // 全局变量
- function nested(){
- var scope = "nested scope"; // 嵌套作用域内的局部变量
- return scope; // 返回当前值作用域内的值
- }
- return nested();
- }
- checkscope() //=>"嵌套作用域"
来源: https://www.2cto.com/kf/201805/746177.html