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

淺談javascript中的作用域

 更新時(shí)間:2012年04月07日 10:51:32   作者:  
首先說明一下:Js中的作用域不同于其他語言的作用域,要特別注意
JS中作用域的概念:

  表示變量或函數(shù)起作用的區(qū)域,指代了它們?cè)谑裁礃拥纳舷挛闹袌?zhí)行,亦即上下文執(zhí)行環(huán)境。Javascript的作用域只有兩種:全局作用域和本地作用域,本地作用域是按照函數(shù)來區(qū)分的。

首先來看幾道題目:

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

if(true){
var aa= "bb";
}
console.log(aa); //bb

for(var i = 0; i < 100; i++){
//do
}
console.log(i); //100

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

var bb = '11111';
function aa() {
alert(bb);//undefine
var bb = 'test';
alert(bb);//test
   var cc = "test1";
alert(age);//語法錯(cuò)誤
}
aa();

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

var test = '1111111';
function aa() {
alert(test);
}

function bb() {
var test = '22222222';
aa();
}

bb();//alert(1111111);

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

alert(typeof aa); //function
alert(typeof bb); //undefined function aa() { //函數(shù)定義式
alert('I am 111111111');
};
var bb = function() { //函數(shù)表達(dá)式
}
alert(typeof bb);//function

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

function aa(){
var bb = "test";
cc = "測(cè)試";
alert(bb);
}
aa();
alert(cc);//測(cè)試
alert(bb);//語法報(bào)錯(cuò)

上面這5道題目全部概括了js中作用域的問題

可以總結(jié)出這么幾個(gè)觀點(diǎn)

一、無塊級(jí)作用域

從第一題中可以看出來,在{}中執(zhí)行后,變量并沒有被銷毀,還是保存在內(nèi)存中的,因此我們可以訪問到的。

二、JavaScript中的函數(shù)運(yùn)行在它們被定義的作用域里,而不是它們被執(zhí)行的作用域里.

這里提到函數(shù)的作用域鏈這個(gè)概念,在ECMA262中,是這樣的

任何執(zhí)行上下文時(shí)刻的作用域, 都是由作用域鏈(scope chain)來實(shí)現(xiàn).
在一個(gè)函數(shù)被定義的時(shí)候, 會(huì)將它定義時(shí)候的scope chain鏈接到這個(gè)函數(shù)對(duì)象的[[scope]]屬性.
在一個(gè)函數(shù)對(duì)象被調(diào)用的時(shí)候,會(huì)創(chuàng)建一個(gè)活動(dòng)對(duì)象(也就是一個(gè)對(duì)象), 然后對(duì)于每一個(gè)函數(shù)的形參,都命名為該活動(dòng)對(duì)象的命名屬性, 然后將這個(gè)活動(dòng)對(duì)象做為此時(shí)的作用域鏈(scope chain)最前端, 并將這個(gè)函數(shù)對(duì)象的[[scope]]加入到scope chain中.
所以題目3 結(jié)果是alert(1111111);

三、JS會(huì)提前處理function定義式 和var關(guān)鍵字

  如題目4 開始alert(bb); //undefine ,alert(age)//語法報(bào)錯(cuò),這兩個(gè)有什么區(qū)別呢,原因就是后面有var bb =“test”,在初始化的時(shí)候提前處理了var 這個(gè)關(guān)鍵字,只是這個(gè)開始未賦值

將代碼修改成這樣的,可以看出來
復(fù)制代碼 代碼如下:

var dd = '11111';
function aa() {
alert(bb);//undefine
   var bb = 'test';
alert(bb);//test
   var cc = "test1";
alert(age);//語法錯(cuò)誤
}
aa();
alert(dd);//11111
alert(cc);//語法報(bào)錯(cuò)

此處alert(bb)沒有報(bào)語法錯(cuò)誤,alert(age)報(bào)語法錯(cuò)誤。

但是請(qǐng)注意:
復(fù)制代碼 代碼如下:

<script>
alert(typeof aa); //結(jié)果:undefined
</script>
<script>
function aa() {
alert('yupeng');
}
</script>

這說明js預(yù)編譯是以段為單元的。題目4同理

四、函數(shù)級(jí)作用域

  函數(shù)里面的定義的變量,在函數(shù)執(zhí)行完后就銷毀了,不占有內(nèi)存區(qū)域了。

  所以題目2最后的alert(cc);語法報(bào)錯(cuò),題目5最后到 alert(bb)同理

相關(guān)文章

最新評(píng)論

永川市| 舞钢市| 海门市| 淳化县| 济阳县| 屯门区| 三都| 东辽县| 黄骅市| 增城市| 鹰潭市| 滕州市| 敦煌市| 稻城县| 金寨县| 鹤壁市| 嘉荫县| 搜索| 攀枝花市| 江津市| 桃园市| 靖安县| 图木舒克市| 静海县| 远安县| 镇安县| 远安县| 晋城| 平阳县| 南投市| 德令哈市| 武平县| 许昌县| 镇康县| 禄劝| 澳门| 永城市| 安平县| 积石山| 荃湾区| 蒙山县|