作用域,是指变量的生命周期(一个变量在哪些范围内保持一定值)。
全局变量: 生命周期将存在于整个程序之内。 能被程序中任何函数或者方法访问。 在 JavaScript 内默认是可以被修改的。全局变量,虽然好用,但是是非常可怕的,这是所有程序员公认的事实。
带有关键字 var 的声明;
<script type="text/javascript"> var testValue = 123; var testFunc = function () { console.log('just test') }; /**---------全局变量会挂载到 window 对象上------------**/ console.log(window.testFunc) // ƒ () { console.log('just test') } console.log(window.testValue) // 123 </script>其实,我们写的函数如果不经过封装,也会是全局变量,他的生命周期也就是全局作用域;
不带有声明关键字的变量,JS 会默认帮你声明一个全局变量!!!
<script type="text/javascript"> function foo(value) { result = value + 1; // 没有用 var 修饰 return result; }; foo(123); // 124 console.log(window.result); // 124 <= 挂在了 window全局对象上 </script>现在,变量 result 被挂载到 window 对象上了!!!
函数作用域内,对外是封闭的,从外层的作用域无法直接访问函数内部的作用域!!!
function bar() { var testValue = 'inner'; } console.log(testValue); // 报错:ReferenceError: testValue is not defined通过 return 访问函数内部变量:
function bar(value) { var testValue = 'inner'; return testValue + value; } console.log(bar('fun')); // "innerfun"函数就像一个工厂,我们输入一些东西,它在内部加工,然后给我们一个加工产物;
关于闭包,我不会在这篇文章过多描述,因为,想要描述闭包,本身需要跟本文章一样的长度;
这是个很实用的函数,很多库都用它分离全局作用域,形成一个单独的函数作用域;
<script type="text/javascript"> (function() { var testValue = 123; var testFunc = function () { console.log('just test'); }; })(); console.log(window.testValue); // undefined console.log(window.testFunc); // undefined </script>它能够自动执行 (function() { //… })() 里面包裹的内容,能够很好地消除全局变量的影响;