理解作用域 Minoz

  

1.全局作用域

var global = "global";   
for(var i = 0; i <8; i++) {
    var a = 10;       
}
console.log(global);  //global
console.log(i);          //8
console.log(a);         //10

扫一眼感觉没什么就是这个答案呀,可是你是否还记得但年大年湖畔的c和c++么?想起来了吧!javascript是没有块级作用域的,因此对于js来说变量i和a都是全局变量,所以皆可以输出i和a的值。

那么,js里没有办法块级作用域,使变量成为局部变量么,答案当然是肯定的啦!

方法1.使用立即函数

(function(){
    var part = "part"; 
})();

方法2.避免预编译

!function() {  
    var a = 90;
}();
+function() {  
    var a = 80;
}();

2.函数作用域

function func() { 
    var b = 0;
}
console.log(b);    //b is not defined

函数作用域,只在函数内部有效。

好,那再来一个

function func() {
    num =  12;
}
alert(num);  //12

由于没有用var声明变量,会默认为是全局变量,因此可以访问到。

最后,再来说一下作用域链

var color = "red";
function getColor() {
    return color;
}
alert(getColor());  //red

当调用getColor()时,返回变量color,首先会搜索getColor()变量的对象,若没有就去搜索getColor()上一级是否有color变量,就这样一级一级向上找(到全局变量停止)直到找到最近的color变量返回其值,这形成了一条作用域链。下图展示搜索过程:

 

原文地址:https://www.cnblogs.com/nalixueblog/p/4390774.html