本文目錄一覽:
JavaScript作用域問題!
setInterval 具有非同步的作用 它會等到最後再執行 這個時候i = 3了,es6 可以用let定義變數i 或者用立即執行函數包下setInterval 也可以解決
javascript this作用域詳解
如果從js 底層語法來講,this 指的是當前對象的prototype.
即如果你調用的是一個方法:
function fun(){
this.val = “”;
}
fun();
那麼這裡的this 指的就是fun這個方法對象的prototype 通俗來講就是方法對象
如果是給你個Html的Button註冊的時間方法,那麼只想的是這個button.
所以this所指向的對象其實是可以動態改變的,並不是一成不變,1樓的回答只是瀏覽器的默認Prototype。
js中setInterval與作用域
setInterval()的第一個參數如果是字元串,這個字元串中的代碼就是在全局環境中執行的,作用域固定是全局作用域window
只有第一個參數是函數時,才能有函數創建時所在的作用域。
setInterval(function(){fun()},1000);
js全局和局部的作用域
樓下說的不對吧!
首先:第一個,第一行定義了一個全局的var01,再在方法里定義了一個var01,首先搞清楚什麼是var ,這是個變數聲明關鍵字,他出現在哪和你全局不全局沒有任何關係!
第一個之所以undefind是因為你將一個變數名定義兩次,這個是不允許的,undefind在這裡本質是聲明錯誤,內存中不存在,即聲明時發生錯誤,內存沒有記錄!不存在的東西js統一報錯undefind!
第二個:輸出1,是因為,js是腳本語言,在執行時按照順序載入,當執行到write時,var01的值是1,此時還沒執行到var01=0,這一步,所以先到先得,取出為1,然後在將var01賦值為0,但是此前js就已經輸出了,所以0不會被輸出!
關於全局和非全局,等你做久了你其實會發現,把全局叫做作用域會更好,他作用於誰,取決於你在何處聲明(var關鍵字),比如你在頁面的js第一行就寫一個var var01,那這個var01就只作用於這個頁面,那我是不是可以理解,所謂全局是整個程序,那我雖然定義了一個var,卻不能延伸到整個程序,那我是不是就可以推翻這個var看起來像全局,但在我的語境中其實並非全局,他只是我這個頁面的全局,對於我整個程序來說,這個頁面又是個局部!所以用作用域來解釋會更好!
如果確實需要區分的話,那你可以這樣理解
根據js 的執行順序是逐行執行的特點,那麼在js中,首先出現的var就是全局(順帶一提,function某種程度上等同var,再此與var並論!)所以簡單理解就是,方法體外的var都是這個js的全局,方法體內的都是這個方法體的全局(你沒聽錯,是這個方法體的全局!!!!!),但是,方法體是js 的全局,方法體內的var是方法的全局,而var var01的作用域又限定為方法體,所以,方法體內的var相對於js來說只能是局部.
其實這還漏了一個知識點:叫做,方法私有屬性,即:方法體內定義的任何屬性和方法都只歸其父方法所有!!!!!
理解:某個頁面的js文件理解為一個大方法,這個方法里又有其他方法,而子方法里的屬性因為只歸其父,所以父方法的父方法無權調用,父父方法若要調用只有通知其子方法,讓子方法通知其子屬性並暴露給其父父方法!
但願你聽懂了,哈利路亞!自己都繞了
什麼是js作用域
執行環境(execution context,為簡單起見,有時也稱為「環境」)是 JavaScript 中最為重要的一個概 念。執行環境定義了變數或函數有權訪問的其他數據,決定了它們各自的行為。每個執行環境都有一個 與之關聯的變數對象(variable object),環境中定義的所有變數和函數都保存在這個對象中。雖然我們 編寫的代碼無法訪問這個對象,但解析器在處理數據時會在後台使用它。 全局執行環境是最外圍的一個執行環境。根據 ECMAScript 實現所在的宿主環境不同,表示執行環 境的對象也不一樣。在 Web 瀏覽器中,全局執行環境被認為是 window 對象(第 7 章將詳細討論),因 此所有全局變數和函數都是作為 window 對象的屬性和方法創建的。某個執行環境中的所有代碼執行完 畢後,該環境被銷毀,保存在其中的所有變數和函數定義也隨之銷毀(全局執行環境直到應用程序退 出——例如關閉網頁或瀏覽器——時才會被銷毀)。 每個函數都有自己的執行環境。當執行流進入一個函數時,函數的環境就會被推入一個環境棧中。 而在函數執行之後,棧將其環境彈出,把控制權返回給之前的執行環境。ECMAScript 程序中的執行流 正是由這個方便的機制控制著。 當代碼在一個環境中執行時,會創建變數對象的一個作用域鏈(scope chain)。作用域鏈的用途,是 保證對執行環境有權訪問的所有變數和函數的有序訪問。作用域鏈的前端,始終都是當前執行的代碼所 在環境的變數對象。如果這個環境是函數,則將其活動對象(activation object)作為變數對象。活動對 象在最開始時只包含一個變數,即 arguments 對象(這個對象在全局環境中是不存在的)。作用域鏈中 的下一個變數對象來自包含(外部)環境,而再下一個變數對象則來自下一個包含環境。這樣,一直延 續到全局執行環境;全局執行環境的變數對象始終都是作用域鏈中的最後一個對象。
原創文章,作者:SDAE0,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/127751.html