js代碼作用域解析(js 作用域作用域鏈)

本文目錄一覽:

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-hk/n/127751.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
SDAE0的頭像SDAE0
上一篇 2024-10-03 23:16
下一篇 2024-10-03 23:16

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • JS Proxy(array)用法介紹

    JS Proxy(array)可以說是ES6中非常重要的一個特性,它可以代理一個數組,監聽數據變化並進行攔截、處理。在實際開發中,使用Proxy(array)可以方便地實現數據的監…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變量和數…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • Python中init方法的作用及使用方法

    Python中的init方法是一個類的構造函數,在創建對象時被調用。在本篇文章中,我們將從多個方面詳細討論init方法的作用,使用方法以及注意點。 一、定義init方法 在Pyth…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • 倉庫管理系統代碼設計Python

    這篇文章將詳細探討如何設計一個基於Python的倉庫管理系統。 一、基本需求 在着手設計之前,我們首先需要確定倉庫管理系統的基本需求。 我們可以將需求分為以下幾個方面: 1、庫存管…

    編程 2025-04-29
  • 寫代碼新手教程

    本文將從語言選擇、學習方法、編碼規範以及常見問題解答等多個方面,為編程新手提供實用、簡明的教程。 一、語言選擇 作為編程新手,選擇一門編程語言是很關鍵的一步。以下是幾個有代表性的編…

    編程 2025-04-29
  • Python實現簡易心形代碼

    在這個文章中,我們將會介紹如何用Python語言編寫一個非常簡單的代碼來生成一個心形圖案。我們將會從安裝Python開始介紹,逐步深入了解如何實現這一任務。 一、安裝Python …

    編程 2025-04-29

發表回復

登錄後才能評論