Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
JavaScript(簡稱JS)作為現代Web開發的基石,其靈活性和強大功能為前端開發人員提供了無限可能。理解和掌握JS的作用域機制,包括全局變量、局部變量以及作用域鏈的概念,對于編寫高效、可維護的代碼至關重要。本文旨在深入剖析這些概念,通過實例講解它們的工作原理,幫助初學者和有經驗的開發者鞏固知識,提升編程技能。
var globalVar='I am global';
function localScope() {
var localVar='I am local';
console.log(localVar); // 輸出: I am local
}
localScope();
console.log(globalVar); // 輸出: I am global
console.log(localVar); // 報錯: localVar is not defined
作用域鏈是JS引擎在函數執行時創建的一個鏈表,用于確定變量的可訪問性。每個函數都有自己的作用域鏈,鏈的最前端是當前函數的局部變量,隨后是包含它的函數的作用域,直到全局作用域。
當JS引擎查找一個變量時,它會從當前作用域開始搜索,如果沒有找到,則沿著作用域鏈向上查找,直到找到變量或者到達全局作用域。
function outerFunction() {
var outerVar='Outer Variable';
function innerFunction() {
console.log(outerVar); // 輸出: Outer Variable
}
return innerFunction;
}
var innerFunc=outerFunction();
innerFunc();
在構建模塊化和可復用的代碼時,理解作用域機制是至關重要的。例如,在異步回調或事件處理程序中正確使用閉包,可以避免“變量泄漏”。
function setupEvent() {
var counter=0;
document.getElementById('myButton').addEventListener('click', function() {
counter++;
console.log('Clicks:', counter);
});
}
setupEvent();
過度依賴全局變量可能導致內存泄漏和命名空間污染。使用模塊模式或ES6的let和const關鍵字可以有效避免這些問題。
(function(module) {
module.init=function() {
// 初始化代碼
};
})(window.MyModule={});
// 或者使用ES6
const myModule=(()=> {
let privateVar='Private';
return {
getPrivate: ()=> privateVar
};
})();
全局變量、局部變量以及作用域鏈是JS編程的基礎概念,深刻理解它們有助于編寫健壯、高效的代碼。隨著ES6及后續版本的推出,諸如塊級作用域、箭頭函數等新特性進一步增強了作用域管理的能力,為開發者提供了更多的工具和可能性。未來,隨著前端工程化的發展,作用域管理和模塊化的最佳實踐將變得更加重要,助力開發者構建更加復雜和高性能的應用。
希望本文能幫助你建立對JS作用域機制的深入理解,并在實際項目中加以運用,不斷精進你的編程技藝。
帶領學生學習JavaScript,都講到計時事件了。發現如果不講清楚全局變量,便沒辦法把停止計時事件講清楚。
clearInterval() 方法用于停止 setInterval() 方法執行的函數代碼。
要使用 clearInterval() 方法, 在創建計時方法時你必須使用全局變量-----------菜鳥教程 JavaScript計時事件
便補充一下:
原本全局變量這個東西,在講了函數后就應該介紹一下的,只是一直沒有較好的應用場景,一直拖著。正好,借著這個機會,現講現用。
舉例1:
<script>function aa(){ var a=10; alert(a);}function bb(){ alert(a);}</script>
在函數bb中就無法訪問到a這個變量。
每一個花括號({})好比我們的一間教室,而這個a好比是老師我,現在老師在這間教室上課,隔壁班的學生能聽到嗎?
不能!
類比一下,所以這種情況為什么是錯誤的,就能夠理解了。
現在,如果老師我跑出去,跑到廣播室,大聲地宣布:都去到操場,課不上了,請問隔壁班的能聽到嗎?
<script>
var a=10;
functionaa(){
alert(a);
}
functionbb(){
alert(a);
}
</script>
能聽到!
這種情況下,a就是一個全局變量!
這樣比方之后,感覺學生大部分能理解了。但是出現了惡意抬杠的(感覺還是沒理解透),問我這種情況a的值為什么變了:
<script>
ar a=10;
function aa(){
var a=100;
alert(a);
}
function bb(){
alert(a);
}
</script>
首先,函數aa里面的var 是多余的,有或者沒有,一個意思。其次,這種情況好比:老師在廣播里通知大家去操場, 回頭又跑到你們班來說,不用去了。你們聽哪一個?是去還是不去?
不去。
同樣的道理,雖然全局變量的初始值是10,但是在函數里重新賦值為100,這個時候已經改變了變量的值。
學生進一步胡攪蠻纏:
<script>
var a=10;
function aa(){
var b=100;
alert(a);
}
function bb(){
alert(a);
}
</script>
那這種情況呢?
好比老師在廣播通知你們班接下來兩節課到機房上,然后你們班主任跑到教室通知你們下午的衛生要好好打掃,你們聽誰的?
班主任的!這一次異口同聲。
我倒忘了這茬,反問,接下來兩節課都不是她的,你們也聽她的啊?
兩個變量毫不相干,沒有任何影響嘛。
全局變量就講了這么多,覺得這個比方還算貼切,所以貼了出來……
隨后在計時事件中完善代碼,終于完成了停止功能,按下不表……
我自己是一名從事了多年開發的web前端老程序員,目前辭職在做自己的web前端私人定制課程,今年年初我花了一個月整理了一份最適合2019年學習的web前端學習干貨,各種框架都有整理,送給每一位前端小伙伴,想要獲取的可以關注我的頭條號并在后臺私信我:前端,即可免費獲取
作者:yulele
鏈接:https://www.jianshu.com/p/06e8f6a2fb65
avascript有兩種變量:局部變量和全局變量。局部變量是指只能在變量聲明的函數內部調用。全局變量時整個代碼中都可以調用的變量(window對象的變量)。
局部變量包括函數內聲明的變量和函數的形式參數。
全局變量num預處理時,只聲明未定義,所以第一次輸出undefined;函數fn內部num被聲明,所以其為局部變量,預處理時函數fn既聲明又定義了,并且函數fn有倆個形式參數n1和n2;函數fn執行時會開辟新的作用域,在新的作用域下,此時的局部變量num預處理時只聲明,所以輸出undefined;n1被賦值100,n2被賦值200,局部變量num為300,所以第三次輸出為300;第四次輸出為全局變量num,無法訪問函數內的局部變量num,所以結果為10。
函數形成了一個私有的作用域,保護了內部的局部變量不被外界干擾。局部變量和全局變量相互獨立、互不影響。
此時函數fn內的num未被聲明,按照javascript作用域鏈的原理,當一個變量在當前作用域下找不到該變量的定義,那么javascript引擎就會沿著作用域鏈往上找直到在全局作用域里查找,所以函數fn內的num屬于全局變量。
關鍵詞:作用域 變量 作用域鏈 閉包
*請認真填寫需求信息,我們會在24小時內與您取得聯系。