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