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
})();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM