JavaScript的变量作用域是什么(如何理解变量作用域?)

JavaScript中的变量作用域是什么?它们内部的作用域是否与外部的作用域相同?JS的作用域很重要吗?如果变量是全局定义的,这些变量都存在哪里了?
作用域在JavaScript中是比较重要的内容,这不像其它语言,JS没有块作用域,如下:

var name = "JavaScript"; // name属性在全局作用域下 for(var i = 0; i < name.length; i++){ // i属性同样在全局作用域下 console.log(name[i]); }

for循环语句块不是一个作用域,在里面定义或声明的变量在语句块外都可以访问的,其它while语句等也是类型。
JavaScript只有三种作用域:全局作用域、函数作用域、eval作用域,常见的是全局作用域和函数作用域,关于作用域的概念可以参考JavaScript执行上下文的运行原理,作用域实际上是在创建执行上下文的时候创建的,执行上下文会创建一个作用域链,所在的执行环境访问变量是在作用域链中查找相应的变量的。
下面是理解JavaScript作用域的例子:
1、全局作用域变量
var value = "http://www.srcmini.com/React"; function run(){ console.log(value); // 先查找run中的作用域没有value,于是到全局作用域中找到 }

2、函数本地作用域
var name = "Vue"; function speak(){ var name = "React"; console.log(name); // 输出React,先在当前作用域中查找name,找到则不再查找全局 }

3、函数作用域和全局作用域
var value = "http://www.srcmini.com/JavaScript"; function run(){ if(false){ var value = "http://www.srcmini.com/TypeScript"; } console.log(value); // 输出undefined } run();

为什么输出undefined呢?这个同样和JavaScript的执行上下文有关,创建执行上下文的时候,vaule属性会预先在VO变量对象中赋值为undefined,尽管if语句块不会执行,但是在变量对象中还是存在value,所以在run内部访问value的时候会首先在当前作用域中查找,找到value则不再去全局作用域查找value。
4、闭包作用域
var name = "java"; function lang(){ var name = "javascript"; return function(){ console.log(name); // 输出javascript,lang上下文内存为释放,一直驻留在内存中 }; }function run(){ var name = "python"; var fn = lang(); fn(); }run();

这个例子同样和执行上下文有关,返回一个函数会造成函数的执行上下文驻留在内存中,以后调用该函数都是访问其上下文中的变量,与外部变量无关。
5、作用域和原型链
function User(){ this.name = "JS"; } User.prototype.name = "PS"; var user = new User(); console.log(user.name); // 输出JS

【JavaScript的变量作用域是什么(如何理解变量作用域?)】user对象自己拥有一个name属性,调用的时候优先使用,而User的原型对象上的name属性不会被访问到。

    推荐阅读