導航:首頁 > 編程語言 > js客戶端域

js客戶端域

發布時間:2025-08-17 09:39:14

Ⅰ JS全局變數是全局對象的屬性,函數局部變數為什麼就不是函數的屬性呢

局部變數和全局變數同名時,會隱藏這個全局變數;
4.變數
關鍵字: 4.變數
4.1 變數的類型
JS是鬆散類型的語言
4.2 變數的聲明
var 聲明是變數的標准聲明
var 聲明的變數是永久性的,不能用delete運算符刪除

全局對象,調用對象初始化時,JS解析器會在相應的代碼段里尋找var聲明的變數,
然後在全局對象,調用對象中創建相應的屬性,此時它是未賦值的(undefined),
程序執行到相應的var聲明代碼段時才會給相應對象的屬性賦值

重復的聲明:根據以上var聲明作用的理解,重復的var聲明不會造成任何錯誤,
var聲明只是方便創建全局對象,調用對象的屬性,代碼只是賦值用的

遺漏的聲明:給未聲明的變數賦值,JS會隱式聲明全局變數(在全局對象中增加相應的屬性),然後給其賦值
4.3 變數的作用域
全局變數,局部變數
局部變數和全局變數同名時,會隱藏這個全局變數
4.3.1 沒有塊級作用域
函數中聲明的變數,無論在哪裡聲明的,在整個函數中它們都是有定義的
4.3.2 未聲明的變數和未賦值的變數
alert(u);會產生一個錯誤--使用未聲明的變數會產生一個錯誤
var u;alert(u);會跳出undefined---使用未賦值的變數,使用的它的默認值undefined

4.4 基本類型和引用類型
第三章已經講過
4.5 垃圾收集
java

4.6 作為屬性的變數
4.6.1 全局對象
JS解釋器開始運行時,在執行任何JS代碼前,會創建一個全局對象,這個對象的屬性就是JS全局變數,
並初始化為undefined
var聲明一個JS全局變數時,實際上就是定義了一個全局對象的屬性,

JS解釋器還會用預定義的值和函數來初始化全局對象的許多屬性,如:Infinity parseInt Math

非函數內部可以用this來引用這個全局對象

客戶端的JS中,Window對象代表瀏覽器窗口,它包含該窗口中的所有JS代碼的全局對象,具有自我引用的window屬性
4.6.2 局部變數:調用對象
函數的局部變數存放在調用對象的屬性
調用對象是一個完全獨立的對象,所以可以防止覆蓋同名的全局變數
4.6.3 JS的執行環境
JS解釋器執行一個函數時,會創建一個執行環境
JS允許同時存在多個全局執行環境,如:JS客戶端的ifame的情況

4.7 深入理解變數作用域
每個JS執行環境都有一個和它相關聯的作用域鏈它是一個對象列表或對象鏈.
查詢x:變數名解析(variable name resolution)的過程,它開始查看作用域鏈的每一個對象,
如果有,返回值,如果沒有繼續查詢下一個對象,以些類推.
作用域鏈的優先順序:嵌套函數的調用對象>調用對象>全局對象

根據以上理解說明JS初始化的過程:

在JS解釋器執行任何代碼之前,創建全局對象
用預定義的值和函數來初始化全局對象中的屬性,eg.Math,Infinity,parseInt
搜索函數外的var聲明,創建全局對象相應的屬性,初始化為undefined
創建全局的執行環境,作用域鏈只有一個對象-全局對象
依次執行代碼
遇到var聲明賦值語句給全局對象相應的屬性賦值
遇到未聲明賦值語句,在全局對象中增加相應的屬性,並賦值
遇到函數調用,創建調用對象
搜索函數中的var聲明和參數,創建調用對象相應的屬性,初始化為undefined
創建函數執行環境,作用域鏈--第一對象:調用對象;第二對象:全局對象
依次執行代碼
遇到var聲明賦值語句給調用對象相應的屬性賦值
遇到未聲明賦值語句,在全局對象中增加相應的屬性,並賦值
遇到函數調用,創建嵌套函數的調用對象
搜索嵌套函數中的var聲明和參數,創建嵌套函數的調用對象相應的屬性,初始化為undefined
創建嵌套函數執行環境,作用域鏈--第一對象:嵌套函數的調用對象;第二對象:調用對象;第三對象:全局對象

依此類推

eg1.
var scope="global";
function f(){
alert(scope);
var scope="local";
alert(scope);
}
f();
過程:
創建全局對象,搜索函數外的var聲明語句,在全局對象中創建scope屬性,scope=undefined
創建全局的執行環境,作用域鏈只有一個對象:全局對象
依次執行代碼:
var scope="global"時,變數名解析開始,在全局對象屬性中查找scope屬性
把"global"賦給scope
遇到函數調用:創建調用對象
搜索函數中的var聲明語句和參數,在調用對象中創建scope的屬性,scope=undefined
創建函數執行環境,作用域鏈:調用對象>全局對象
依次執行代碼:
alert(scope),查詢scope,變數名解析,先搜索調用對象,找到scope屬性,其值為undefined,執行
var scope="local",查詢scope,變數名解析,先搜索調用對象,找到scope屬性,scope="local"
alert(scope),查詢scope,變數名解析,先搜索調用對象,找到scope屬性,其值為"local",執行

eg2.
var scope="global";
function f(){
alert(scope);
scope="local";
alert(scope);
}
f();
過程:
創建全局對象,搜索函數外的var聲明語句,在全局對象中創建scope屬性,scope=undefined
創建全局的執行環境,作用域鏈只有一個對象:全局對象
依次執行代碼:
var scope="global"時,變數名解析開始,在全局對象屬性中查找scope屬性
把"global"賦給scope
遇到函數調用:創建調用對象
搜索函數中的var聲明語句和參數,沒有找到var聲明語句
創建函數執行環境,作用域鏈:調用對象>全局對象
依次執行代碼:
alert(scope),查詢scope,變數名解析,先搜索調用對象,沒找到scope屬性,再搜索全局對象,找到scope屬性,其值為"global"執行
scope="local",查詢scope,變數名解析,先搜索調用對象,沒找到scope屬性,,再搜索全局對象,找到scope屬性,scope="local"
alert(scope),查詢scope,變數名解析,先搜索調用對象,沒找到scope屬性,再搜索全局對象,找到scope屬性,其值為"local",執行
eg3.
scope1="global";
alert(scope1);
function f(){
alert(scope2);
scope2="local";
}
f();
過程:
創建全局對象,沒有找到var聲明語句,沒有自定義的全局對象屬性
創建全局的執行環境,作用域鏈只有一個對象:全局對象
依次執行代碼:
scope1="global"時,變數名解析開始,作用域鏈是沒有找到scope1屬性,在全局對象屬性中創建scope1屬性,並賦值為"global"
alert(scope1)時,變數名解析開始,作用域鏈是找到scope1屬性,其值為"global",執行
遇到函數調用:創建調用對象
搜索函數中的var聲明語句和參數,沒有找到var聲明語句
創建函數執行環境,作用域鏈:調用對象>全局對象
依次執行代碼:
alert(scope2),查詢scope2,變數名解析,作用域鏈是沒有找到scope2屬性,報錯scope2 is not defined
例:
function square(num){
total=num*num; //這是操作全局變數。
return total;
}
val total=50;
val number=square(20);
alert(total);//total的值變成了400。
這些代碼將導致全局變數total的值發生變化。
把這個函數寫成這樣才是正確的:
function square(num){
var total=num*num;
return total;
}
又如:
<script>
var cookie="i am cookie";
function test(){
var cookie="i am not fei cookie";//定義局部變數的值,test函數執行後不會影響到全局的cookie
}
test();
document.write(cookie);
</script> //////////// 輸出 i am cookie
去掉test()函數中變數var如下:
<script>
var cookie="i am cookie";
function test(){
cookie="i am not fei cookie";//修改全局變數的值
}
test();
document.write(cookie);
</script>//////test函數執行後輸出 i am not fei cookie
在函數中並且不加var如何改變全局變數?如下:
<script>
var cookie="i am cookie";
function test(){
var cookie="i am not fei cookie";//定義局部變數的值,test函數執行後不會影響到全局的cookie
window.cookie=cookie; ///第一個cookie是全局的函數外部定義的,後面的cookie是在函數內定義的
}////利用window.變數
test();
document.write(cookie);
</script>/////輸出i am not fei cookie

要在方法1中 訪問 方法2的變數。
必須藉助於 全局變數。
在方法2中 操作全局變數 window.cookie=cookie;
這時全局變數被 改變。
在這方法一 中去訪問。

var total;
square();
square1();
function square(){
total='aaaa';
}
function square1(){
alert(total);
}

閱讀全文

與js客戶端域相關的資料

熱點內容
qqjssdk只能彈窗么 瀏覽:633
linux中拷貝文件夾命令 瀏覽:784
光碟格式的文件還能找回來嗎 瀏覽:422
excel文件切割器 瀏覽:734
公文處理的基本程序 瀏覽:857
微軟640升級win10教程 瀏覽:502
兩個表格如何快速篩選出一樣的數據 瀏覽:971
暑假少兒編程培訓班怎麼學 瀏覽:745
網路攝像頭如何存儲 瀏覽:166
qq炫舞助手 瀏覽:646
蘋果原產於 瀏覽:844
webclip描述文件密碼是多少 瀏覽:342
ps改不了psd文件的字體 瀏覽:199
excel跨文件多表引用數據 瀏覽:787
易語言取鍵盤代碼 瀏覽:532
win10文件夾視頻圖片刪除 瀏覽:355
如何使文件中的圖片一樣大 瀏覽:667
qq相冊如何破解許可權 瀏覽:999
win10中修改文件許可權 瀏覽:8
vivo手機桌面圖片在哪個文件夾 瀏覽:350

友情鏈接