1. javascript無塊級作用域,變量在函數內部可見。
- function func_scope(){
- var x=1;
- if (true) {
- var x=2;
- if (true) {
- var x=3;
- alert(x);
- }
- alert(x);
- }
- alert(x);
- }
- func_scope();
這個地方具體是一個x變量,還是3個真不清楚?其實也沒人有毛病這樣定義變量
輸出:
3
3
3
2. 對象初始化可以對自身的屬性執行修改,可以修改全局變量的值。
- function foo(){
- foo.abc = function(){alert('def')};
- this.abc = function(){alert('xyz')};
- abc = function(){alert('@@@@@')};
- var abc = function(){alert('$$$$$$')};
- }
- foo.prototype.abc = function(){alert('456');}
- foo.abc = function(){alert('123');}
- var f = new foo();
- f.abc();
- foo.abc();
- abc();
輸出:
xyz
def
錯誤: abc is not defined (相應解釋在第3個例子中)
3. 函數內,只要變量名前面出現var則該變量為局部變量。
- var myVar = "GLOBAL";
- function foo() {
- // myVar已經在下面聲明,但是在此之前卻沒有定義
- alert("myVar evaluates to '"+myVar+"'");
- // 這個myVar其實是局部變量
- myVar = "NEW_GLOBAL_VALUE";
- alert("myVar evaluates to '"+myVar+"'");
- // window.myVar指向全局的myVar
- alert("myVar evaluates to '"+window.myVar+"'");
- // 聲明一個局部變量myVar,去掉這個則輸出結果就完全不同
- var myVar = "LOCAL";
- alert("myVar evaluates to '"+myVar+"'");
- }
- foo();
- alert("myVar evaluates to '"+myVar+"'");
輸出:
myVar evaluates to ‘undefined’
myVar evaluates to ‘NEW_GLOBAL_VALUE’
myVar evaluates to ‘GLOBAL’
myVar evaluates to ‘LOCAL’
myVar evaluates to ‘GLOBAL’
對應第2個例子,foo中的abc(abc = function(){alert(’@@@@@’)};)為局部變量,全局變量中沒有定義過abc所以會報undefine的錯誤。
結論:
* 1.只要在函數內部聲明變量使用了var,不管是if(false){var aa}, 他都是局部變量;反之,是全局變量;
* 2.聲明所有的變量都應該加上var,防止產生歧義;
* 3.盡量避免引入全局變量。