欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javascript權威指南 學習筆記之變量作用域分享

 更新時間:2011年09月28日 00:19:09   作者:  
最近一直在看《javascript權威指南 第五版》,變量作用域這一章,看得真的有點累。不過,收獲還是多多。
不知道,大家對語言中變量的“聲明”與“定義”是怎么理解的,
我的理解如下:
“聲明”變量,只是僅僅聲明,而“定義”變量,指聲明了,并且賦值了。
例如:
復制代碼 代碼如下:

var name;//只是聲明
var num = 11;//聲明,并且賦值,即定義了
var password = "yangjiang";//聲明,并且賦值,即定義了

下面是幾點總結:
變量的作用域:全局的和局部的。(注意:如果嘗試讀取一個未聲明的變量的值,javascript會生成一個錯誤)
第一點:在都使用var關鍵字修飾變量的情況下,如果給一個局部變量或函數(shù)的參數(shù)聲明的名字與某個全局變量的名字相同,
那么就有效地隱藏了這個全局變量。
例如:
復制代碼 代碼如下:

var scope1 = "global";//var修飾
function checksScope(){
var scope1 = "local";//var修飾
document.write(scope1);
}checksScope();//local

第二點:如果嘗試給一個未用 var 關鍵字聲明的變量,那么,隱式聲明的變量總是被創(chuàng)建為全局變量,即使
該變量只在一個函數(shù)體內使用(只有該函數(shù)運行了,才會發(fā)生作用),注意不支持函數(shù)嵌套的情形。
例如:
復制代碼 代碼如下:

scope2 = "globalAAAAA";//沒有使用var修飾(js會默認將其聲明為全局變量)
function checkScopeA(){
scope2 = "localAAAAA";//沒有使用var修飾(js會默認將其聲明為全局變量)
document.write("<br/>"+scope2);
myscope = "myLocalAAAAA";//沒有使用var修飾(js會默認將其聲明為全局變量)
document.write(","+myscope);
}
checkScopeA();//localAAAAA,myLocalAAAAA *A
document.write("<br/>"+scope2);//localAAAAA *B
document.write("<br/>"+myscope);//myLocalAAAAA *C

如果將上面的例子中的 *A處的代碼注釋掉,
例如:
復制代碼 代碼如下:

scope2 = "globalAAAAA";//沒有使用var修飾(js會默認將其聲明為全局變量)
function checkScopeA(){
scope2 = "localAAAAA";//沒有使用var修飾(js會默認將其聲明為全局變量)
document.write("<br/>"+scope2);
myscope = "myLocalAAAAA";//沒有使用var修飾(js會默認將其聲明為全局變量)
document.write(","+myscope);
}
//checkScopeA(); *A
document.write("<br/>"+scope2);//globalAAAAA *B
document.write("<br/>"+myscope);//發(fā)生錯誤 *C

因為函數(shù)checkScopeA沒有執(zhí)行,所以 *B處輸出為globalAAAAA;
因為函數(shù)checkScopeA沒有執(zhí)行,所以變量myscope沒有聲明,如果嘗試讀取一個未聲明的變量,會發(fā)生錯誤。
第三點:
在javascript中,函數(shù)的定義是可以嵌套的。由于 每個函數(shù)都有它自己的局部作用域,所以有可能出現(xiàn)幾個局部作用域的嵌套層。
例如:
復制代碼 代碼如下:

var scope3 = "global scope"; //定義了一個全局變量
function checkScopeB(){
var scope3 = "local scope"; //定義了一個局部變量,覆蓋了全局變量scope3
function nested(){
var scope3 = "nested scope"; //在函數(shù)的函數(shù)的內部,定義了一個局部變量
document.write("<br/>"+scope3); //nested scope
}
nested();
}
checkScopeB();//nested scope

第四點:
在javascript中,沒有塊級作用域,函數(shù)中聲明的所有變量,無論是在哪里聲明的,在整個函數(shù)中它們都是有聲明的。
在javascript中,沒有塊級作用域,函數(shù)中定義的所有變量,無論是在哪里定義的,在整個函數(shù)中它們都是有定義的。
例如:
復制代碼 代碼如下:

function test(o){//根據(jù)以上的說明:此函數(shù)中的i,j,k三個變量的作用域是相同的。
var i = 0; //變量 i 在整個函數(shù)中都有定義
if(typeof o == "object"){
var j = 0 ; //變量 j 在整個函數(shù)中都有定義,而不僅僅是在 if 語句塊
for(var k=0;k<10;k++){//變量 k 在整個函數(shù)中都有定義,而不僅僅是在 if 語句塊
document.write("<br/>k的值為:"+k);
}
document.write("<br/>for循環(huán)外k的值:"+k);//此時的 k 仍然被定義了,k=10
}
document.write("<br/>j的值:"+j); //變量 j 被聲明了,但可能沒有被初始化 因為可能往函數(shù)中 傳入的參數(shù) 不是對象 ,if語句塊不會執(zhí)行
}

下面通過兩種方式調用此函數(shù):
方式一:傳入對象
test({});//輸出結果:上例中的注釋
方式二:什么都不傳
test();//輸出結果:j的值:undefined
想不明白的是,在第二種方式中的輸出結果,為什么會是 undefined。我當時猜的是:j的值:0
后來,這本書上面說:
由于局部變量在整個函數(shù)體內都是有聲明(或定義)的,這就意味著在整個函數(shù)體中都隱藏了同名的全局
變量。雖然 局部變量在整個函數(shù)體內中都是有聲明(或定義)的,但是在執(zhí)行var語句之前,它是不會被初始化的。
這樣的話,上面的方式二調用的輸出結果,就比較好解釋了,由于變量j在整個函數(shù)中都有定義,而又由于傳入函數(shù)的參數(shù)為空,所以函數(shù)體中的if語句不會執(zhí)行,從而使得j的值為undefined.(這是我參照上面書上說的那句話的理解)
下面的例子,更好的說明:
復制代碼 代碼如下:

var sssss = "全局變量";
function f(){
document.write("<br/>"+sssss);//輸出:undefined 而不是輸出"全局變量"
var sssss = "局部變量";
document.write("<br/>"+sssss);//輸出:局部變量
}

相關文章

  • JavaScript實現(xiàn)簡單的計算器

    JavaScript實現(xiàn)簡單的計算器

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)簡單的計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • 精通Javascript系列之Javascript基礎篇

    精通Javascript系列之Javascript基礎篇

    javascrpit的基本概念分析,剛開始學習js的朋友可以參考下。
    2011-06-06
  • 百度小程序自定義通用toast組件

    百度小程序自定義通用toast組件

    這篇文章主要介紹了百度小程序自定義通用toast組件,百度小程序的toast僅支持在頁中展示,不能自定義位置、字體大小、在單個文本中增加icon等需求;因此自定義一個全局可通用的Toast,需要的朋友可以參考下
    2019-07-07
  • javascript同步服務器時間和同步倒計時小技巧

    javascript同步服務器時間和同步倒計時小技巧

    本文給出如何在頁面上同步顯示服務器時間的解決方案,能夠實現(xiàn)同步服務器時間、同步倒計時,卻不占用服務器太多資源,下面我給寫出實現(xiàn)的思路
    2015-09-09
  • js封裝的textarea操作方法集合(兼容很好)

    js封裝的textarea操作方法集合(兼容很好)

    對應用到對textarea處理的朋友可以參考下??刂频谋容^不錯的代碼封裝。
    2010-11-11
  • js為空或不是對象問題的快速解決方法

    js為空或不是對象問題的快速解決方法

    這篇文章主要介紹了js為空或不是對象問題的快速解決方法。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • ES6代碼轉ES5詳細教程(babel安裝使用教程)

    ES6代碼轉ES5詳細教程(babel安裝使用教程)

    Babel 是一個廣泛使用的 ES6 轉碼器,可以將 ES6 代碼轉為 ES5 代碼,從而在老版本的瀏覽器執(zhí)行,這意味著,你可以用 ES6 的方式編寫程序,又不用擔心現(xiàn)有環(huán)境是否支持,這篇文章主要介紹了ES6代碼轉ES5教程(babel安裝使用教程),需要的朋友可以參考下
    2023-01-01
  • 原生JS生成九宮格

    原生JS生成九宮格

    這篇文章主要為大家詳細介紹了原生JS生成九宮格,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • javascript htmlencode函數(shù)(ff兼容版) 主要是編輯器中反轉html代碼

    javascript htmlencode函數(shù)(ff兼容版) 主要是編輯器中反轉html代碼

    非常不錯的htmlencode 方法,比用正則實現(xiàn)的更好,而且效率高,推薦使用第一種方法。
    2009-06-06
  • javascript:void(0)是什么意思示例介紹

    javascript:void(0)是什么意思示例介紹

    Javascript中void是一個操作符,該操作符指定要計算一個表達式但是不返回值,有不了解的朋友可以參考下本文
    2013-11-11

最新評論