第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JS作用域的幾個問題匯總求解答

JS作用域的幾個問題匯總求解答

幻滅丶 2016-06-25 10:45:57
代碼(1)?<script?type="text/javascript"?language="javascript">? var?rain?=?1;? function?rainman(){? var?man?=?2;? function?inner(){? var?innerVar?=?4;? alert(rain);? }? inner();?//調用inner函數? }? rainman();?//調用rainman函數? </script>第一個代碼是很容易理解的觀察alert(rain);這句代碼。JavaScript首先在inner函數中查找是否定義了變量rain,如果定義了則使用inner函數中的rain變量;如果inner函數中沒有定義rain變量,JavaScript則會繼續(xù)在rainman函數中查找是否定義了rain變量,在這段代碼中rainman函數體內沒有定義rain變量,則JavaScript引擎會繼續(xù)向上(全局對象)查找是否定義了rain;在全局對象中我們定義了rain?=?1,因此最終結果會彈出'1'。?作用域鏈:JavaScript需要查詢一個變量x時,首先會查找作用域鏈的第一個對象,如果以第一個對象沒有定義x變量,JavaScript會繼續(xù)查找有沒有定義x變量,如果第二個對象沒有定義則會繼續(xù)查找,以此類推。?上面的代碼涉及到了三個作用域鏈對象,依次是:inner、rainman、window。?緊接著第二個問題來了JavaScript沒有塊級作用域。?這一點也是JavaScript相比其它語言較靈活的部分。?仔細觀察下面的代碼,你會發(fā)現變量i、j、k作用域是相同的,他們在整個rain函數體內都是全局的。?看到這里也是很好理解的,可是調用rainman()的下面我又創(chuàng)建了一個函數function()?fn1{alert(j)}?為什么不能調用了??第一個代碼證明他會沿著作用域鏈去找一直到window對象。為什么ijk在rainman中管用,我在創(chuàng)建一個函數就不管用了??<script?type="text/javascript"?language="javascript">? function?rainman(){? /**? *?rainman函數體內存在三個局部變量?i?j?k? */? var?i?=?0;? if(?1?){? var?j?=?0;? for(?var?k?=?0?;?k?<?3?;?k++?){? alert(?k?);?//分別彈出?0?1?2? }? alert(?k?);?//彈出3? }? alert(?j?);?//彈出0? }? rainman() funtion?fn1(){alert(j)}???//這里表示很疑惑! fn1() </script>第三個問題有點白癡如下代碼?x=100?等于全局函數改變可以改變相同命名的var?x這不奇怪。但是如果我把下面的x=100改成var?x=100呢?還有為什么我在調用rain()的位置下面輸入man(),會無效?只能在rain中運行這是為什么?<script?type="text/javascript"?language="javascript">? function?rain(){? var?x?=?1;? function?man(){? x?=?100;? }? man();?//調用man? alert(?x?);?//這里會彈出?100? }? rain();?//調用rain? </script>第四個問題簡單明了?下面的代碼為什么會是這個輸出結果。道理我是知道的預解析先找var?function?參數。然后執(zhí)行代碼?function內第一行的相當于var?x;然后alert(x)當然是undifined。但是自從學了作用域鏈以后總感覺他會想上去找這個X或者去找下面的那個X。在或者JS有變量提升的特性自動把var擠上面去。為什么沒有?如果不弄得明明白白清清楚楚以后難免會犯錯<script?type="text/javascript"?language="javascript">? var?x?=?1;? function?rain(){? alert(?x?);?//彈出?'undefined',而不是1? var?x?=?'rain-man';? alert(?x?);?//彈出?'rain-man'? }? rain()? </script>
查看完整描述

1 回答

已采納
?
Walk_

TA貢獻48條經驗 獲得超30個贊

函數內定義的變量是局部變量,這方面的內容我昨天回答過,你可以先看看。

http://idcbgp.cn/wenda/detail/320933

明白這點前面的問題都不是問題了,我就說一下三四問。

三:

函數內定義變量未使用var關鍵詞時,定義的是全局變量而不是局部變量。

這涉及到函數內變量提升,實際的運行代碼是這樣:

var?x?=?1;
function?rain()?{
var?x;?//會將變量定義提升到函數頂部
alert(x);?//彈出?'undefined',因為還未給變量賦值?
var?x?=?'rain-man';//給變量賦值
alert(x);?//彈出?'rain-man'?
}
rain()


查看完整回答
反對 回復 2016-06-25
  • 1 回答
  • 0 關注
  • 1507 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號