JS作用域深度解析
更新時(shí)間:2016年12月29日 11:15:06 作者:光明大神棍
這篇文章主要為大家詳細(xì)介紹了JS作用域,剖析JS的作用域問(wèn)題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
本文實(shí)例為大家深度剖析JS的作用域,代碼注釋詳細(xì),供大家參考,具體內(nèi)容如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>作用域問(wèn)題</title>
</head>
<body>
<script>
/*
* 1.全局變量與局部變量
* 外層變量可以在內(nèi)層調(diào)用(全局),內(nèi)層變量不能在外層調(diào)用(局部)
* */
var a = 1;
(function () {
// 外部變量可以在內(nèi)部調(diào)用
alert(a);
})();
/*function test() {
// 內(nèi)部變量不能在外部調(diào)用
var a = 2;
}
alert(a); // 報(bào)錯(cuò)*/
/*
* 下面舉個(gè)例子:
* 函數(shù)調(diào)用只是回到函數(shù)定義的地方,調(diào)用一下函數(shù)
* 這里在bbb函數(shù)中,調(diào)用aaa函數(shù),
* 這時(shí)的aaa函數(shù)并不是被放入bbb函數(shù)中,而是在原定義的地方
* 這是的aaa中沒(méi)有變量a,所以去訪(fǎng)問(wèn)全局變量中的a
* */
/*var a = 10;
function aaa() {
alert(a);
}
function bbb() {
var a = 20;
aaa();
}
bbb(); // 10*/
/*
* 2.當(dāng)var不加的時(shí)候,會(huì)自動(dòng)變成全局變量
* 在全局環(huán)境中,不加var和加var效果一樣,都是全局變量
* 在局域環(huán)境中,加var會(huì)被定義為局部變量,不加var會(huì)被定義為全局變量
* */
/*function test() {
var a = 10; // 外部訪(fǎng)問(wèn)不到
b = 10; // 相當(dāng)于全局變量
// 上面相當(dāng)于:var a = b = 10;
}
test();
alert(b); // 10
alert(a); // 報(bào)錯(cuò)*/
/*
* 3.變量查找按照就近原則去查找
* var定義的變量,當(dāng)就近查找沒(méi)有找到就去外層查找
* */
/*var a = 10;
(function() {
var a = 20;
// a在匿名函數(shù)中var定義了,所以找到為20
alert(a); // 20
})();*/
/*var a = 10;
(function() {
a = 20; // 相當(dāng)于全局變量,將外部的var a = 20;
// 在匿名函數(shù)中沒(méi)有找到var定義的a,然后去外層去查找
// 外部查找到了,var a = 10 = 20;
alert(a); // 20
})();*/
/*var a = 10;
(function() {
// 在匿名函數(shù)中沒(méi)有找到var定義的a,然后去外層去查找
// 外部查找到了,var a = 10
alert(a); // 10
a = 20;
})();*/
/*var a = 10;
(function() {
// 在匿名函數(shù)中找到var定義的a,
// 這里的var a = 20,存在變量提升,
// 在執(zhí)行alert(a)之前,變量提示有var a;
// 但是a沒(méi)有值,所有返回undefined
alert(a); // undefined
var a = 20;
// 在變量提升的情況下,相當(dāng)于下面:
// var a;
// alert(a);
// a = 20;
})(;*/
/*var a = 10;
(function() {
// 執(zhí)行bbb,bbb中的a=20,但是與匿名函數(shù)和全局變量a無(wú)關(guān)
bbb();
// 在匿名函數(shù)中查找var定義的a,發(fā)現(xiàn)沒(méi)有
// 繼續(xù)在外層中查找,發(fā)現(xiàn)了 var a = 10;
alert(a); // 10
function bbb() {
var a = 20;
}
})();*/
/* var a = 10;
(function() {
bbb();
// 在匿名函數(shù)中查找var定義的a,發(fā)現(xiàn)沒(méi)有
// 繼續(xù)在外層中查找,發(fā)現(xiàn)了 var a = 10 = 20;
alert(a); // 20
function bbb() {
// 沒(méi)有var定義,所有為全局變量,外面的全局變量 var a = 10 = 20;
a = 20;
}
})();*/
/*
* 當(dāng)參數(shù)與局部變量重名時(shí),優(yōu)先級(jí)等同
* */
/*var a = 10;
(function (a) {
// 這里的參數(shù)a是基本類(lèi)型,按值傳參的
// 相當(dāng)于在匿名函數(shù)內(nèi)部重新定義了一個(gè)a,
// 且與外層的a不相關(guān)
a += 3;
})(a);
alert(a); // 10*/
/*var a = [1,2,3];
(function (a) {
// 這里的參數(shù)a是特殊類(lèi)型,按引用傳參的
// 相當(dāng)于在匿名函數(shù)內(nèi)部重新定義了一個(gè)a,
// 但是這個(gè)a是外層a的一個(gè)別名,它們引用了同一個(gè)地址
// 所以?xún)?nèi)部a添加值,外部a可以訪(fǎng)問(wèn)到
a.push(4);
})(a);
alert(a); // [1,2,3,4]*/
/*var a = [1,2,3];
(function (a) {
// 這里的參數(shù)a是特殊類(lèi)型,按引用傳參的
// 相當(dāng)于在匿名函數(shù)內(nèi)部重新定義了一個(gè)a,
// 但是這個(gè)a是外層a的一個(gè)別名,它們引用了同一個(gè)地址
// 所以?xún)?nèi)部a添加值,外部a可以訪(fǎng)問(wèn)到
// 但是,這里的a又重新賦值了新的數(shù)組,斷開(kāi)了與外層的關(guān)系
a = [1,2,3,4];
})(a);
alert(a); // [1,2,3]*/
</script>
</body>
</html>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
js動(dòng)態(tài)添加帶圓圈序號(hào)列表的實(shí)例代碼
這篇文章主要介紹了js動(dòng)態(tài)添加帶圓圈序號(hào)列表的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
讓textarea自動(dòng)調(diào)整大小的js代碼
讓textarea自動(dòng)調(diào)整大小的js代碼,需要的朋友可以參考下。2011-04-04
純js實(shí)現(xiàn)瀑布流展現(xiàn)照片(自動(dòng)適應(yīng)窗口大小)
用瀑布流來(lái)展現(xiàn)照片再好不過(guò)了,我的思路大概是一張一張的圖片插入,當(dāng)這一行的圖片保持長(zhǎng)寬比例不變并且高度低于250時(shí)就完成一個(gè)了循環(huán),即這一行插入進(jìn)去了2013-04-04
js+css 實(shí)現(xiàn)遮罩居中彈出層(隨瀏覽器窗口滾動(dòng)條滾動(dòng))
本文為大家詳細(xì)介紹下使用js實(shí)現(xiàn)遮罩彈出層居中,且隨瀏覽器窗口滾動(dòng)條滾動(dòng),示例代碼如下,感興趣的朋友可以參考下2013-12-12
通過(guò)JS自動(dòng)隱藏手機(jī)瀏覽器的地址欄實(shí)現(xiàn)原理與代碼
大家通過(guò)手機(jī)自帶瀏覽器打開(kāi)百度、淘寶,在首頁(yè)加載完畢后,會(huì)自動(dòng)隱藏頁(yè)面上方的地址欄,感興趣的朋友可以參考下2013-01-01

