最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript變量作用域使用中常見錯誤總結(jié)

 更新時間:2013年03月26日 11:14:11   作者:  
剛看了一篇文章對js作用域的理解又會上升到一個新的臺階,javascript里變量作用域是個經(jīng)常讓人頭痛抓狂的問題,接下來對經(jīng)常遇到又容易出錯的情況進行了簡單總結(jié),感興趣的各位可以參考下哈

今天在rainweb的博客上,看到了這篇非常好的文章,覺得非常有必要分享出來,相信大家認真讀完這篇文章,對js作用域的理解又會上升到一個新的臺階。

前言:javascript里變量作用域是個經(jīng)常讓人頭痛抓狂的問題,下面通過10++個題目,對經(jīng)常遇到又容易出錯的情況進行了簡單總結(jié),代碼樣例很短很簡單

題目一

復(fù)制代碼 代碼如下:

var name = 'casper'; alert(name); //毫無疑問地輸出:casper

題目二
復(fù)制代碼 代碼如下:

alert(name); //報錯:對象未定義,即使用一個壓根就不存在的變量,所以出錯
age = 24; //這里木有錯,但age不是為定義嗎?翻下犀牛書,明白了 //給一個未定義的變量賦值,會創(chuàng)建一個全局變量,相當(dāng)于:var age = 24

題目三
復(fù)制代碼 代碼如下:

alert(name); //name下面才定義,這里肯定報錯了吧?錯!這里彈出:undefined
var name = 'casper';

解釋:javascript代碼在解析的時候,都會搜索下var聲明的變量,并將其聲明提前,實際的過程如下:
復(fù)制代碼 代碼如下:

var name; //光聲明name變量,但未賦值,所以為此時為:undefined
alert(name); name = 'casper';

題目四
復(fù)制代碼 代碼如下:

var name = 'casper';
function show(){
alert(name);
name = 'hello'; //全局變量name的值改為'hello'
}
show(); //輸出:casper

題目五
復(fù)制代碼 代碼如下:

var name = 'casper';
function show(){ alert(name); //輸出:undefined,是不是有想死的心
var name = 'hello'; //注意:與題目四相比,此處name前多了個var,
} show();

解釋:在函數(shù)show中,name是個局部變量,題目三的原理同樣適用于此,即函數(shù)show內(nèi)部實際為
(小知識點補充:當(dāng)函數(shù)內(nèi)部存在與外部全局變量同名的局部變量,優(yōu)先使用局部變量,此處為name)
function show(){ var name; alert(name); name = 'hello'; }
題目六
復(fù)制代碼 代碼如下:

var list = [1,2,3];
function show(){ if(typeof list === 'undefined')
{ list = []; }
alert(list.length);
};
show(); //結(jié)果:3,是不是一目了然= =,稍等,請接著看第七題

題目七
復(fù)制代碼 代碼如下:

var list = [1,2,3];
function show(){
if(typeof list === 'undefined')
{ var list = []; //請注意,與題目六相比,這里多了個var
} alert(list.length); };
show(); //結(jié)果:0,是不是突然有了想死的沖動

解釋:javascript沒有塊級作用域(即由{}限定的作用域),函數(shù)中聲明的所有變量,無論在哪里聲明,在整個函數(shù)中都是有定義的,這點跟C++等灰常不同,趕緊扭轉(zhuǎn)思想與時俱進
于是,再來看下show方法實際的內(nèi)部解析邏輯
復(fù)制代碼 代碼如下:

function show(){ var list; //list為局部變量,且此處尚未賦值
if(typeof list === 'undefined'){
list = []; }
alert(list.length); };

題目八
復(fù)制代碼 代碼如下:

alert(typeof show); //結(jié)果:function,請相信你的眼睛,你沒有看錯
function show(){}

解釋:javascript代碼解析的過程,類似 function show() 這種形式聲明的函數(shù),跟var聲明的變量一樣,都會被提到最前面,不同的是,函數(shù)聲明跟定義同時完成,但var聲明的變量的賦值在后面才會完成
題目九
復(fù)制代碼 代碼如下:

alert(typeof show); //結(jié)果:undefined,請再次擦亮你的眼睛,你的確沒有看錯
var show = function(){};

解釋:采用函數(shù)定義式以及函數(shù)表達式定義函數(shù),兩者過程之間存在一些區(qū)別
函數(shù)定義式:function show(){}
函數(shù)表達式:var show = function(){}
采用函數(shù)定義式聲明的方法,函數(shù)的定義會提前;而采用函數(shù)表達式聲明的方法,函數(shù)的定義,跟采用var聲明的局部變量一樣,函數(shù)聲明會提前,但函數(shù)定義位置不變,過程如下:
復(fù)制代碼 代碼如下:

var show; alert(typeof show);
show = function(){};

題目十
復(fù)制代碼 代碼如下:

var data = {name:'casper'};
function data(){ alert('casper'); }
data(); //TypeError: object is not a function

是不是有砸顯示器的沖動。。。data此時其實為{name:'casper'},把一個object當(dāng)函數(shù)調(diào)用,于是報錯了
前面說過,函數(shù)聲明(通過函數(shù)定義式)、var聲明的變量會被提前,但是會有先后順序之分,如下:
復(fù)制代碼 代碼如下:

function data(){ alert('casper');
} var data; data = {name:'casper'};
data();

略微修改下,結(jié)果就不同鳥:
復(fù)制代碼 代碼如下:

var data = {name:'casper'};
var data = function (){ //通過函數(shù)表達式聲明函數(shù)
alert('casper'); }
data(); //結(jié)果:casper

結(jié)合上文不難猜想過程如下:
復(fù)制代碼 代碼如下:

var data; data = {name:'casper'};
data = function (){ alert('casper'); }
data(); //結(jié)果:casper

相關(guān)文章

  • 利用JS實現(xiàn)scroll自定義滾動效果詳解

    利用JS實現(xiàn)scroll自定義滾動效果詳解

    這篇文章主要給大家介紹了關(guān)于利用JS如何實現(xiàn)scroll自定義滾動效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • 利用JS自動打開頁面上鏈接的實現(xiàn)代碼

    利用JS自動打開頁面上鏈接的實現(xiàn)代碼

    今天經(jīng)過測試,實現(xiàn)了利用JS來自動打開頁面上的鏈接的功能,其實比較簡單,就是在頁面上把鏈接列表列出來,然后通過JQuery的相關(guān)控制,在框架頁中把鏈接打開,具體能做什么用,大家自己想,哈哈。
    2011-09-09
  • JavaScript ES6中類與模塊化管理超詳細講解

    JavaScript ES6中類與模塊化管理超詳細講解

    JavaScript中的模塊化是指將每個js文件會被認為單獨一個的模塊。模塊之間是互相不可見的。如果一個模塊需要使用另一個模塊,那么需要通過指定語法來引入要使用的模塊,而且只能使用引入模塊所暴露的內(nèi)容
    2023-01-01
  • 基于javascript實現(xiàn)放大鏡特效

    基于javascript實現(xiàn)放大鏡特效

    這篇文章主要為大家詳細介紹了基于javascript實現(xiàn)放大鏡特效,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 使用JavaScript實現(xiàn)一個簡單的哈希映射功能

    使用JavaScript實現(xiàn)一個簡單的哈希映射功能

    哈希表大家應(yīng)該都經(jīng)常用到吧,那么大家有沒有想過哈希表是怎么實現(xiàn)的呢,本文我們就來從一道簡單的題目來了解一下哈希表的簡單原理和實現(xiàn)吧
    2024-02-02
  • JavaScript常用的彈出廣告及背投廣告實現(xiàn)方法

    JavaScript常用的彈出廣告及背投廣告實現(xiàn)方法

    這篇文章主要介紹了JavaScript常用的彈出廣告及背投廣告實現(xiàn)方法,實例分析了彈出廣告與背投廣告的實現(xiàn)原理與相關(guān)技巧,需要的朋友可以參考下
    2015-02-02
  • JS擴展方法實例分析

    JS擴展方法實例分析

    這篇文章主要介紹了JS擴展方法,實例分析了javascript擴展方法的原理與各種常用的擴展應(yīng)用技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • 一文搞懂JavaScript中的內(nèi)存泄露

    一文搞懂JavaScript中的內(nèi)存泄露

    以前我們說的內(nèi)存泄漏,通常發(fā)生在后端,但是不代表前端就不會有內(nèi)存泄漏。特別是當(dāng)前端項目變得越來越復(fù)雜后,前端也逐漸稱為內(nèi)存泄漏的高發(fā)區(qū)。本文就帶大家了解一下Javascript的內(nèi)存泄漏
    2022-06-06
  • JS實現(xiàn)單行文字不間斷向上滾動的方法

    JS實現(xiàn)單行文字不間斷向上滾動的方法

    這篇文章主要介紹了JS實現(xiàn)單行文字不間斷向上滾動的方法,以實例形式較為詳細的分析了文字滾動效果實現(xiàn)的原理與技巧,需要的朋友可以參考下
    2015-01-01
  • 前端實現(xiàn)添加水印功能的四種方法

    前端實現(xiàn)添加水印功能的四種方法

    這篇文章主要介紹了前端實現(xiàn)添加水印功能的四種方法,分別是使用CSS、Canvas、SVG以及動態(tài)生成水印圖像,每種方法都有其特點和適用場景,并且每種方法都給出了實例代碼,需要的朋友可以參考下
    2025-03-03

最新評論

南阳市| 陇南市| 和田市| 东光县| 富蕴县| 财经| 新和县| 塔河县| 明溪县| 宁明县| 和硕县| 绍兴市| 磐石市| 雷波县| 崇信县| 左云县| 合川市| 北碚区| 息烽县| 涪陵区| 定襄县| 栾城县| 南充市| 沾益县| 县级市| 揭东县| 石城县| 巨野县| 墨玉县| 福建省| 保德县| 乌拉特中旗| 偏关县| 龙里县| 义马市| 泌阳县| 镇雄县| 朝阳市| 德保县| 股票| 沽源县|