JS局部变量,全局变量新解

就是这种盲目无原理依据的研究测试弄晕了我, 有必要这么做吗? 其实理解了原理就没必要搞这么多一个一个的试, 然后得出规律, ECMAScript规则都已经定义好了.
var的规则是: 使用var声明变量就是内部变量, 否则就是先调用全局变量, 不管多少层函数.
this的规则是: method函数里的this永远指向自身, 普通函数的this永远指向DOMWindow.

// GodDamnTest1
function Foo() {  
    var a = 123;  // 局部变量, 所有子函数的全局变量
    this.a = 456;  // 对象属性
    (function() {  
        alert(a); // 123, 全局
        alert(this.a); // undefined, 普通函数, this指向DOMWindow  
    })();  
}  
var f = new Foo(); 

// GodDamnTest2
function Foo() {  
    var a = 123;  
    this.a = 456;  
    (function(a) {  // 局部声明
        alert(a); // 456, 被函数局部声明的a覆盖了全局  
    })(this.a);  
}  
var f = new Foo(); 

// GodDamnTest3
function Foo() {  
    var a = 123;  
    this.a = 456;  
    (function() {  
        alert(a); // 123, 全局
        alert(this.a); // undefined, DOMWindow 
        this.b = 789;  // window.b = 789
    })();  
    (function() {  
        alert(this.b); // 789, window.b
    })();  
}  
var f = new Foo();  
(function() {  
    alert(this.b); // 789, window.b
})(); 

// GodDamnTest4
function Foo() {  
    (function() {  
        this.b = 789;  // window.b = 789
    })();  
    (function() {  
        alert(this.b); // 789, window.b
        var b = 0;  
        alert(b); // 0, 这样的测试也写出来了!
    })();  
}  
var f = new Foo();  
(function() {  
    alert(this.b); // 789, window.b
    alert(b); // 789, window.b
})();  
令人意外的是,最后一个 alert(b),结果仍然是 789。  // no damn surprise at all!

// GodDamnTest5
function Foo() {  
    (function() {  
        this.b = 789;  // window.b = 789
    })();  
    (function() {  
        alert(this.b); // 789, window.b
        alert(b); // undefined, 全局
        var b = 0;  
        alert(b); // 0, 还有这种测试!
    })();  
}  
var f = new Foo();  
(function() {  
    alert(this.b); // 789, window.b
    alert(b); // 789, window.b
})();

posted @ 2012-12-29 11:25  活在春天  阅读(4746)  评论(0)    收藏  举报