JS中如何生成全局變量


JS中如何生成全局變量

一、總結

一句話總結:在函數內部,一般用var聲明的為局部變量,沒用var聲明的一般為全局變量

在函數內沒用var聲明的一般為全局變量

 

1、js中的函數中的this指向的是誰?

函數的調用者 window對象

指向的是函數的調用者,在這里也就是window對象

1 <script>
2     //===========題目列表信息全局變量
3     //顯示的題目的編號
4     showQuestionNum={$question_list['info']['now_question_num']};
5     //題目總數
6     totalQuestionNum={$question_list['info']['question_num']}
7 </script>

 

 1 <script>
 2     //上一題下一題邏輯
 3     function getQuestionAbove(){
 4         if(parseInt(this.showQuestionNum)>1) this.showQuestionNum=parseInt(showQuestionNum)-1;
 5         showQuestion(showQuestionNum);
 6     }
 7     function getQuestionBelow(){
 8         if(parseInt(this.showQuestionNum)<parseInt(totalQuestionNum)) this.showQuestionNum=parseInt(showQuestionNum)+1;
 9         showQuestion(showQuestionNum);
10     }
11 </script>

 

 

 

2、下面程序的結果是多少?

100  10  100

|||-begin

var a = 10;
function test(){
    a = 100;
    console.log(a);
    console.log(this.a);
    var a;
    console.log(a);
}
test();

|||-end

程序的運行結果為:100  10  100

解析:Javascript在執行前會對整個腳本文件的聲明部分做完整分析(包括局部變量),從而確定變量的作用域,所以在函數test執行前,由於第6行聲明了局部變量a,所以函數內部的a都指向已經聲明的局部變量,所以第4行輸出100。第5行輸出this.a,我們都知道,函數內部的this指針指向的是函數的調用者,在這里函數test被全局對象調用,所以this指針指向全局對象(這里即window),所以this.a = window.a,一開始生命了全局變量a=10,所以第5行輸出結果為10。第7行輸出結果為100,因為局部變量a在第3行已經被賦值了100,所以直接輸出局部變量a的值。

 

 

3、下面程序運行的結果是多少?

undefined  10

|||-begin

var a = 100;
function test(){
    console.log(a);
    var a = 10;
    console.log(a);
}
test();

|||-end

程序的運行結果為:undefined  10

解析:看了第1個例子,可能有同學會認為輸出結果是10  10,但是結果卻不是10 10,為什么呢?仔細看第1個例子解析的第一句話,Javascript在執行前會對整個腳本文件的聲明部分做完整分析(包括局部變量)但是不能對變量定義做提前解析,在這個函數中,執行第3行前,可以認為已經聲明了變量a,但是並沒有定義(這里即賦值),所以第3行輸出結果為undefined,執行第4行a =10后,變量a的值就為10,所以第5行輸出結果為10。

 

4、下面程序運行的結果是多少?

100  10  10

|||-begin

1 var a = 100;
2 function test(){
3     console.log(a);
4     a = 10;
5     console.log(a);
6 }
7 test();
8 console.log(a);

|||-end

程序的運行結果為:100  10  10

解析:我們知道在函數內部,一般用var聲明的為局部變量,沒用var聲明的一般為全局變量,在test函數內,a=10聲明了一個全局變量,所以第3行的a應該輸出全局變量的值,而在函數執行之前已經聲明過一個全局變量並賦值100,所以這里第上輸出100。第4行給全局變量a 重新賦值10,所以全局變量a的值變成10,所以第5行輸出10。而在函數test外部,第8行輸出全局變量a的值,因為全局變量被重新賦值為10,所以輸出結果即為10。

 

 

 

二、JS中最經典的全局變量和局部變量問題

參考:JS中最經典的全局變量和局部變量問題
https://www.cnblogs.com/yxz-turing/p/4735934.html

話不多說,直接上例子:

1、程序的運行結果為:100  10  100

1 var a = 10;
2 function test(){
3     a = 100;
4     console.log(a);
5     console.log(this.a);
6     var a;
7     console.log(a);
8 }
9 test();

解析:Javascript在執行前會對整個腳本文件的聲明部分做完整分析(包括局部變量),從而確定變量的作用域,所以在函數test執行前,由於第6行聲明了局部變量a,所以函數內部的a都指向已經聲明的局部變量,所以第4行輸出100。第5行輸出this.a,我們都知道,函數內部的this指針指向的是函數的調用者,在這里函數test被全局對象調用,所以this指針指向全局對象(這里即window),所以this.a = window.a,一開始生命了全局變量a=10,所以第5行輸出結果為10。第7行輸出結果為100,因為局部變量a在第3行已經被賦值了100,所以直接輸出局部變量a的值。

2、程序的運行結果為:undefined  10

1 var a = 100;
2 function test(){
3     console.log(a);
4     var a = 10;
5     console.log(a);
6 }
7 test();

解析:看了第1個例子,可能有同學會認為輸出結果是10  10,但是結果卻不是10 10,為什么呢?仔細看第1個例子解析的第一句話,Javascript在執行前會對整個腳本文件的聲明部分做完整分析(包括局部變量),但是不能對變量定義做提前解析,在這個函數中,執行第3行前,可以認為已經聲明了變量a,但是並沒有定義(這里即賦值),所以第3行輸出結果為undefined,執行第4行a =10后,變量a的值就為10,所以第5行輸出結果為10。

3、程序的運行結果為:100  10  10

1 var a = 100;
2 function test(){
3     console.log(a);
4     a = 10;
5     console.log(a);
6 }
7 test();
8 console.log(a);

解析:我們知道在函數內部,一般用var聲明的為局部變量,沒用var聲明的一般為全局變量,在test函數內,a=10聲明了一個全局變量,所以第3行的a應該輸出全局變量的值,而在函數執行之前已經聲明過一個全局變量並賦值100,所以這里第上輸出100。第4行給全局變量a 重新賦值10,所以全局變量a的值變成10,所以第5行輸出10。而在函數test外部,第8行輸出全局變量a的值,因為全局變量被重新賦值為10,所以輸出結果即為10。

如有錯誤的地方歡迎批評指正

 


免責聲明!

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



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