了解javascript中函數執行順序

我個人覺得一般人不會有這種寫法,但藝不壓身,呵呵。希望能幫到初學的朋友!大家一起進步!
首先列舉出8個例子,然后例子的解答會在文章末尾貼出!

測試代碼一:

<script language="JavaScript" type="text/javascript">
function myFn(){alert('Fn1');
};myFn();function myFn(){alert('Fn2');
};myFn();
</script> 


// 兩次輸出的結果都是Fn2,而不是我們認為的第一次輸出Fn1,第二次輸出Fn2

測試代碼二:

<script type="text/javascript" type="text/javascript">
function myFn(){alert('Fn1');
};
myFn();
</script>
<script type="text/javascript"> function myFn(){alert('Fn2'); }; myFn(); </script>

這次第一次輸出Fn1,第二次輸出Fn2.繼續測試,

測試代碼三:

<script language="JavaScript" type="text/javascript">
var myFn = function(){alert('Fn1');};
myFn();
myFn = function(){alert('Fn2');};
myFn();
</script> 

這次輸出的結果是Fn1,Fn2.

測試代碼四:

<script language="JavaScript" type="text/javascript">
function myFn(){alert('Fn1');};
myFn();myFn = function (){alert('Fn2');};
myFn();
</script>

輸出Fn1,Fn2.

測試代碼五:

<script language="JavaScript" type="text/javascript">
var myFn = function(){alert('Fn1');};
myFn();
function myFn(){alert('Fn2');};
myFn();
</script>

輸出Fn1, Fn1

測試代碼六:

<script language="JavaScript" type="text/javascript">
myFn();
var myFn = function(){alert('Fn1');};
myFn();function myFn(){alert('Fn2');};
myFn();
</script>

輸出結果是Fn2,Fn1,Fn1

測試代碼七:

<script language="JavaScript" type="text/javascript">
myFn();
function myFn(){alert('Fn1');};
</script>

輸出Fn1,而不是未定義的函數

測試代碼八:

<script language="JavaScript" type="text/javascript">
myFn();
var myFn = function(){alert('Fn1');};
</script> 

則提示缺少對象,也就是函數沒定義。

測試代碼九:

<script language="JavaScript" type="text/javascript">
myFn();
</script><script type="text/javascript" type="text/javascript">
function myFn(){alert('Fn1');}
</script>

則提示缺少對象,也就是函數沒定義。

注:這是我引用網絡上的部分文章內容 我覺得挺好的,所以就在博客發出來,分享一下!
從上面的例子中,可以發現出一點,就是javascript好像也具有"預編譯"(這是我的叫法)的特點,有點類似于傳統編譯型c或c++等。但是在 javascript中,這種預編譯的特性并不是對所有的js代碼進行的。大家可以試下把myFn的函數定義分別放到不同的script代碼塊中進行調用 的時候,會提示對象為定義。所以我個人覺得,js中的這種“預編譯”特性值只是針對屬于同一個代碼塊(指的 是<script></script>)內的代碼有效。
所以,在javascript的執行過程中,js引擎掃描每一script塊的代碼,把里面的各種函數定義都抽出來進行“預編譯”,注意,這里說的是函數定義而不是函數賦值,或者說是定義式的函數,如下的形式就是"定義式的函數":
function myFn(){
  //Something Code
};
編譯完成后,就會根據script塊中的語句從上到下,從左到右進行執行。然后咱們來分析一下各個測試的結果!

測試代碼一:
首 先js引擎掃描該script塊中的函數定義(注意這個時候還沒開始執行代碼),發現有定義式函數function myFn(){}有兩處,由于名字是一樣的,編譯后就合成了一個myFn函數,后面的定義覆蓋了前面的定義,所以在函數執行之前就只有一個編譯的函數 myFn,并且其定義是后面的那個,因此真正到執行代碼的時候,也就是第一次調用myFn(),輸出的當然是Fn2,第二次執行myFn同樣輸出Fn2.

測試代碼二:
由 于javascript的塊編譯特性,因此分成在不同的塊中的代碼是分開編譯的,所以第一個script塊編譯后的myFn函數并沒有被第二塊的myFn 覆蓋,因此第一個執行myFn輸出的是Fn1,同樣第二塊輸出的是Fn2.需要重點指出的是var myFn = function(){};不是定義式函數聲明,而是賦值語句,把一個函數對象賦值給一個變量,賦值語句的執行時機晚于編譯期,定義式函數是在執行語句之 前就已經完成了,而賦值語句要到執行的時候才進行。所以結果就如同大家看到的一般!

根據這樣的分析,我想大家也應該能夠看出后面例子的輸出結果了!

轉載于:https://www.cnblogs.com/yuyifeiyang/p/3540673.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260860.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260860.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260860.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

外部資源獲取

處理外部資源是很繁瑣的事情&#xff0c;我們可能需要處理URL資源、File資源資源、ClassPath相關資源、服務器相關資源&#xff08;JBoss AS 5.x上的VFS資源&#xff09;等等很多資源。因此處理這些資源需要使用不同的接口&#xff0c;這就增加了我們系統的復雜性&#xff1b;而…

芯明天debug assertion failed_YJLV鋁芯電力電纜的基本介紹

原標題&#xff1a;YJLV鋁芯電力電纜的基本介紹YJLV鋁芯電力電纜&#xff0c;型號全稱&#xff1a;鋁芯交聯聚乙烯絕緣聚氯乙烯護套電力電纜。YJLV電纜的含義為&#xff1a;YJ----交聯聚乙烯絕緣;L----線芯材質為鋁材。V----聚氯乙烯護套。YJLV電纜工作溫度為導體額定工作溫度9…

1.1.1 從簡單的數據類型開始

/// <summary>/// C# 1.0 中定義的產品類型/// </summary>public class Product1{string name;public string Name { get { return name; } }decimal price;public decimal Price { get { return price; } }public Product1(string name, decimal price){this.name…

第2章 Python 數字圖像處理(DIP) --數字圖像基礎3 - 圖像內插 - 最近鄰內插 - 雙線性插值 - 雙三次內插 - 圖像放大

目錄圖像內插放大圖像圖像內插 內插通常在圖像放大、縮小、旋轉和幾何校正等任務中使用。內插并用它來調整圖像的大小&#xff08;縮小和放大&#xff09;&#xff0c;縮小和放大基本上采用圖像重取樣方法 最近鄰內插&#xff0c;這種方法將原圖像中最近鄰的灰度賦給了每個新…

然爸讀書筆記(2014-2)----影響力

第一章&#xff1a;影響力的武器 動物可能會看到某種顏色的羽毛而變得具有攻擊性&#xff0c;或者聽到某種叫聲久對自己的天敵呵護有加。動物的這種愚蠢機械反應在人類身上也有&#xff0c;在某個觸發特征出現時&#xff0c;我們會不假思索的做出相應的反應&#xff0c;之所以會…

pb 如何導出csv_Firefox火狐瀏覽器將提供導出密碼至本地的功能

6月2日&#xff0c;據外媒All About Lifehacks報道&#xff0c;Mozilla官方的bug報告頁面顯示&#xff0c;Firefox瀏覽器的導出或備份密碼請求的問題在前兩天被關閉&#xff0c;并被標記為已解決。據了解&#xff0c;該請求早在多年前就有人提出。如今被標記為已解決&#xff0…

跟著別人的感覺做網絡推廣之二

無意中闖入了站臺網&#xff08;一家歷史很悠久的分類信息網站&#xff0c;印象中比58 趕集 百姓創辦時間還早。&#xff09; 進入后當然看醫療分類了&#xff1a; http://www.zhantai.com/ 站臺網&#xff0c;不是大的省份網民不能位置定位時&#xff0c;默認進入的是北京分站…

iOS - OC 面向對象語法

1、類 1&#xff09;根類&#xff1a;因為類 NSObject 是層次結構的最頂層&#xff0c;因此稱為根類。 可以將類稱為子類&#xff08;subclass&#xff09;和父類&#xff08;superclass&#xff09;&#xff0c;也可以將類稱為子類和超類。2&#xff09;分類&#xff0f;類別&…

第2章 Python 數字圖像處理(DIP) --數字圖像基礎4 -- 像素間的一些基本關系 - 鄰域 - 距離測試

目錄像素間的一些基本關系像素的相鄰像素距離測試import sys import numpy as np import cv2 import matplotlib import matplotlib.pyplot as plt import PIL from PIL import Imageprint(f"Python version: {sys.version}") print(f"Numpy version: {np.__ve…

網頁關閉(解決window.close在火狐下不兼容問題)

熟悉前端的都知道&#xff0c;火狐默認狀態非window.open的頁面window.close是無效的 網上有很多人說&#xff0c;在火狐的地址欄輸入:about:config然后找到dom.allow_scripts_to_close_windows;把false改為true 看著這些人的說法&#xff0c;不得不說我蛋疼了 我做的是網站&am…

iphone備忘錄突然沒了_蘋果突然下架12 天貓:雙11有驚喜!iPhone12 mini配色縮水

點擊“藍字”關注我們蘋果旗艦店突然下架iPhone 12 天貓回應&#xff1a;請期待11.11的驚喜今天&#xff0c;有網友反饋&#xff0c;蘋果天貓旗艦店的iPhone 12和iPhone 12 Pro被下架了。小編查看了下&#xff0c;天貓Apple Store旗艦店確實已經下降了目前在售的 iPhone 12 和 …

CGI小白一些漫想

CGI Common Gateway Interface 一種基于瀏覽器的輸入、在Web服務器上運行的程序方法你創建客戶端的 CGI腳本, 服務器端的程序用來處理用戶輸入, 結果返回給用戶CGI腳本是什么&#xff1f;它是怎樣工作的  CGI腳本是用下列兩種方法使用的: 作為一個表單的ACTION 或 作為一個頁中…

SSH開發中 使用超鏈接到action 其excute方法會被執行兩次 actual row count: 0; expected: 1...

由于執行兩次excute,所以在做刪除操作的時候會出現 Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 表示找不到要刪除的在控制臺出現的語句是 Hibernate: delete from user where id? Hibernate: delete from user where id?…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波1 - 灰度變換和空間濾波基礎、Sigmoid激活函數

這里寫目錄標題本節的目標背景灰度變換和空間濾波基礎本節的目標 了解空間域圖像處理的意義&#xff0c;以及它與變換域圖像處理的區別熟悉灰度變換所有的主要技術了解直方圖的意義以及如何操作直方圖來增強圖像了解空間濾波的原理 import sys import numpy as np import cv2…

微軟Edge擴展工具箱旨在將Chrome擴展帶至Edge

微軟Windows 10新工具Edge擴展工具箱旨在讓開發人員可以輕松地將Chrome擴展轉換為微軟Edge擴展。\\微軟Edge擴展工具箱的目標是在少修改或不修改的情況下將Chrome擴展移植到微軟Edge。按照微軟官方的描述&#xff0c;“該工具會創建必要的JSON清單項&#xff0c;架起一座從chro…

absolute 必須 relative_Workfine如何控制身份證號碼必須為18位?

在信息化系統的設計中&#xff0c;由于業務的需要&#xff0c;我們往往需要設置許多控制項&#xff0c;以保證系統能夠按照業務要求流轉&#xff0c;必須出庫數量不能超過庫存&#xff0c;人員信息不能重復錄入&#xff0c;考勤區間不能有交叉等。此篇以實例的方式告訴大家如果…

angularAMD快速入門

ngularAMD是作者 marcoslin 使用 RequireJS &#xff0b; AngularJS開發的前端mvvm框架,因此你可以使用它快速創建一款Web App.他特別適合快速開發SPA應用&#xff0c;適當的和更簡單的方式。 我們整合AngularJS和RequireJS不應該是復雜的&#xff0c;它不是angularAMD。在行動…

ASP.NET MVC5 網站開發實踐(二) Member區域 - 用戶部分(2)用戶登錄、注銷

上次實現了用戶注冊&#xff0c;這次來實現用戶登錄&#xff0c;用到IAuthenticationManager的SignOut、SignIn方法和基于聲明的標識。最后修改用戶注冊代碼實現注冊成功后直接登錄。 目錄&#xff1a; ASP.NET MVC5 網站開發實踐 - 概述 ASP.NET MVC5 網站開發實踐(一) - 項目…

第3章 Python 數字圖像處理(DIP) - 灰度變換與空間濾波2 - 圖像反轉、對數變換

目錄一些基本的灰度變換函數圖像反轉對數變換一些基本的灰度變換函數 如下圖顯示了在圖像處理中頻繁使用的3類基本函數&#xff1a; 線性&#xff08;反轉和恒等變換&#xff09;函數對數&#xff08;對數和反對數變換&#xff09;函數冪律&#xff08;nnn次冪和nnn次根變換&…

為Android應用程序添加社會化分享功能

正在做個android的小應用&#xff0c;有點想嘗試一下社會化分享&#xff0c;比如分享到新浪微博啥的。看一下新浪&#xff0c;人人網的API&#xff0c;說實話功能很全很強大&#xff0c;但雖說有相對的SDK&#xff0c;但是總覺得不方便。因為正在使用友盟的統計SDK&#xff0c;…