学习js,确定要学习做用域,js做用域和其余的主流语言的做用域还存在很大的区别。函数
一.js没有块级做用域。学习
js没有块级做用域,就像这样:spa
if(){ var a = 100;
console.log(a) //输出100 } console.log(a) //输出100
js中像if,for,switch之类的语句,他们包含的代码块里面的变量,在代码块外面也能被读取,因此说,js没有块级做用域。code
二.js的全局变量blog
js中规定,全局变量均可以看做是window的属性,并且全局变量可以被全部的代码块读取。原型链
var a = 10; function() {
b = 20; console.log(a); //输出10; }
console.log(b); //输出20;
虽然在匿名函数中对a没有定义,可是因为a是全局变量,因此其余任何的代码块都可以读取a的值。在一个复杂的项目中,全局变量若是操做不慎,颇有可能带来重大的bug。因此在平时写代码的时候,应该尽可能避免使用全局变量!对于一个变量来讲,若是没有用var来声明的话,那么会自动认为是全局变量,所以,在书写中,必定不能漏写var。作用域
三.js的局部变量原型
js中的全局变量,很容易使代码存在问题,因此咱们应该明确区分全局变量和局部变量!局部变量只在他所在的函数内部读取,在函数外部却没法读取这个变量。it
function doSomething(){ var blogName="智轩资本"; function innerSay(){ alert(blogName); } innerSay(); } alert(blogName); //undefined innerSay(); //undefined
四.js的做用域链问题io
因为js存在全局变量和局部变量,在调用一个变量是,会对他的做用域链进行查找,若是函数内部定义了这个变量,那么取该变量的值,若是没有,那么向上一层查找,若是找到了,就获取这个值,若是还没找到,继续往上层查找,直到找到位置,若是找到最后也没找到,那么该变量的值为undefined。
先看一个例子:
var myName = '智轩资本'; function scoap() { console.log(myName);
var myName = "zhixuan";
console.log(myName);
console.log(age);
}
scoap();
先分析一下这个例子,scoap()将调用这个函数,第一个console.log(name),会对name的值进行原型链查找,首先看函数scoap内部是否进行了定义,发如今函数内部对name进行了定义,那么第一个console.log(name)将再也不往上层查找!那么第一个console.log(name)的值是否是就是“zhixuan”了呢?no!no!no!因为第一个console.log(name)时,对name尚未赋值,因此,第一个console.log(name)为undefined,第二个console.log(name)为“zhixuan”!
再看一个例子:
var a = 10; function zhixuan() { console.log(a); } function ziben() { var a = 20; zhixuan(); } ziben();