js函式和變數的執行順序 易錯

2022-04-22 05:51:27 字數 3068 閱讀 7818

js函式和變數的宣告與執行順序

一、函式執行順序

1、正常順序  

1

function f()

4f(); //alert 2

所有瀏覽器都能測試通過。

2、倒序呼叫

1

f(); //alert 2

2function f()

之前一些瀏覽器會報undefined,不過,目前的版本大多都可以了

3、含參函式倒序

1

f(2);

//alert 2

2function

f(a)

目前主流瀏覽器一樣可以正常測試通過

4、宣告式函式和賦值式函式

1         f();                        //22

function f()

5 f1(); // uncaught typeerror: f1 is not a function

6var f1 = function ()

宣告式函式與賦值式函式的區別在於:在js的預編譯期,宣告式函式將會先被提取出來,然後才按順序執行js**。

二、變數執行順序

1、正常順序

1

var a =2;

2alert(a);

//alert 2

2、倒序使用變數

1

alert(a);

//alert undefined

2var a =2;

在變數未定義之前使用,會返回undefined。

3、區域性變數的執行

*注意:js中全域性var宣告的為全域性變數  函式體內var宣告為區域性變數(函式外部訪問不到)但是,函式體內未用var宣告的為全域性變數(函式外部可以使用)

1

function

f()5 f(); //

error: a is not defined

這裡firefox的控制台中會報錯referenceerror(引用錯誤):a 未被定義。。。。所以建議函式體內最好用var宣告變數,保持區域性性 如:

1

function

f()5 f(); //

undefined

這裡alert語句可以彈出,雖然是undefined ,但是沒有報錯,這是為什麼呢?? 

事實上,js的解析過程分為兩個階段:預編譯期(預處理)執行期

預編譯期js會對本**塊中的所有var宣告的變數和函式進行處理(類似與c語言的編譯),但需要注意的是此時處理函式的只是宣告式函式,而且變數也只是進行了宣告但未進行初始化以及賦值。

執行期會按照**塊的順序逐行執行。。

*函式內部 再次宣告賦值,函式f()內有區域性變數a時,會優先使用自己的變數,只不過第一次alert時未賦值

1

var a = 1;

2function

f()7

8 f(); //

undefined 和 3

*函式內部 再次全域性宣告,會修改全域性的a

1

var a = 1;

2function

f()7 f(); //

1 和 2

*函式內全域性賦值一次,var宣告一次    函式f()內還是會優先使用自己的變數a

var a = 1;                 //

函式f()內變數a的執行順序

function

f()

f();

//undefined 2 和 3

alert(a); //

1

函式f()內 變數a 宣告與賦值 的執行順序如上,應該很明確了!!

*乙個經典的例子複習一下:

1

vara,b;

2 (function

())();

9 alert(a); //

undefined

10 alert(b); //

3

三、總結

1、js的解析過程分為兩個階段:預編譯期(預處理)執行期

預編譯期 js會對本**塊(兩個script塊互不影響)中的所有var宣告的變數函式進行處理(類似與c語言的編譯)

此時處理函式的只是宣告式函式,而且變數也只是進行了宣告但未進行初始化以及賦值。

執行期 會按照**塊的順序築行執行

2、把執行方法寫在函式定義之前是不太規範的,但這個界限被弱化了。如今在乙個作用範圍之內,都可以被正常呼叫。

所以,建議和優化如下:

1.函式體內變數最好var宣告為區域性,保持安全性和區域性性。

2.所有變數的宣告最好一次性寫在作用域的頂端,函式不必需如此,如:

1

function

f()

3.函式的執行方法 最好在 函式的定義 之後

出處: 

js函式執行先後順序

在js函式裡面想要呼叫另乙個函式,之前我的做法是 commutil.closewindow window.parent getparamslist retvalues 大致就是關閉當前視窗,並將當前視窗的值返回到新開啟的視窗,但是這樣的話它是先執行window.parent.getparamslis...

Java靜態變數和建構函式的執行順序

public classmymain class father staticinta printfahter staticintprintfahter class son extendsfather staticintb printson staticintprintson 輸出結果 print i...

Java靜態變數和建構函式的執行順序

案例 package com.devin public class mymain class father static int a printfahter static int printfahter class son extends father static int b printson s...