国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

淺談javascript中的作用域

2024-05-06 14:22:10
字體:
來源:轉載
供稿:網友
JS中作用域的概念:

  表示變量或函數起作用的區域,指代了它們在什么樣的上下文中執行,亦即上下文執行環境。Javascript的作用域只有兩種:全局作用域和本地作用域,本地作用域是按照函數來區分的。

首先來看幾道題目:

1.
代碼如下:
if(true){
var aa= "bb";
}
console.log(aa); //bb

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

2.
代碼如下:
var bb = '11111';
function aa() {
alert(bb);//undefine
var bb = 'test';
alert(bb);//test
   var cc = "test1";
alert(age);//語法錯誤
}
aa();

3.
代碼如下:
var test = '1111111';
function aa() {
alert(test);
}

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

bb();//alert(1111111);

4.
代碼如下:
alert(typeof aa); //function
alert(typeof bb); //undefined function aa() { //函數定義式
alert('I am 111111111');
};
var bb = function() { //函數表達式
}
alert(typeof bb);//function

5.
代碼如下:
function aa(){
var bb = "test";
cc = "測試";
alert(bb);
}
aa();
alert(cc);//測試
alert(bb);//語法報錯

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

可以總結出這么幾個觀點

一、無塊級作用域

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

二、JavaScript中的函數運行在它們被定義的作用域里,而不是它們被執行的作用域里.

這里提到函數的作用域鏈這個概念,在ECMA262中,是這樣的

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

三、JS會提前處理function定義式 和var關鍵字

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

將代碼修改成這樣的,可以看出來
代碼如下:
var dd = '11111';
function aa() {
alert(bb);//undefine
   var bb = 'test';
alert(bb);//test
   var cc = "test1";
alert(age);//語法錯誤
}
aa();
alert(dd);//11111
alert(cc);//語法報錯

此處alert(bb)沒有報語法錯誤,alert(age)報語法錯誤。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 河北区| 芮城县| 甘孜县| 封丘县| 武冈市| 息烽县| 通榆县| 新余市| 麻江县| 灌南县| 鸡东县| 肇州县| 鸡泽县| 搜索| 隆子县| 清镇市| 永安市| 朔州市| 扶绥县| 沧州市| 色达县| 疏勒县| 郎溪县| 甘泉县| 和硕县| 宝兴县| 乐都县| 安康市| 潢川县| 获嘉县| 胶南市| 宁化县| 城步| 志丹县| 安远县| 龙门县| 祥云县| 思茅市| 白河县| 延安市| 郧西县|