1. 程式人生 > >JS函式-函式宣告和函式表示式之間的恩怨

JS函式-函式宣告和函式表示式之間的恩怨

“函式宣告”和“函式表示式”其實說白了 就是定義函式的方式

函式宣告:

function 函式名(){.....}

通過上面方式定義的函式就是函式宣告

函式表示式:通過函式表示式定義函式的方式比較多

1. var a = function test(){...} // 這是命名的函式表示式

  var a = function(){...} // 這是匿名的函式表示式

2. 將“函式宣告”定義的函式 用一對小括號括起來,這樣也形成了函式表示式

(function test(){.....})  //這樣也是函式表示式

3. 還有就是在“函式宣告”前加位運算子 也能構成函式表示式

例如:這些都是函式表示式

~function test(){.....}
+function test(){.....}
-function test(){.....}
!function test(){.....}

區別: 函式宣告 和 函式表示式 有哪些區別那??

1.函式表示式可以直接 在後面加小括號執行(這就是函式自執行),而函式宣告不可以

例如:

var a = function test() {
        alert("hello");
}
 // 這是一個函式表示式,在這個表示式後面加個括號,就可以自動執行函數了

var a = function test() {
        alert("hello");// 重新整理頁面就彈出hello了
 }();

而函式宣告的方式 加個小括號是不可以執行的,例如 瀏覽器會提示這種寫法是錯誤的

function test() {
        alert("hello");
}();

2.函式宣告 可以 被預解析,而函式表示式不可以;如果不明白js預解析的小夥伴,請參考另一篇文章《JS預解析

例如:

 window.onload = function () {
        test();
        function test() { // 函式宣告
            alert("hello");
        }
}

通過函式宣告的方式定義的函式是可以被預解析的,所以在function test()之前呼叫test()函式,自然彈出hello,

 window.onload = function () {
        a();
        var a = function () { // 函式表示式
            alert("hello");
        }
}

通過函式表示式的方式定義的函式是不能被預解析的,所以在函式之前呼叫a(),就會報錯


再看一個例子:

window.onload = function () {
        a();
       if(true){
           function a() {
               alert("1");
           }
       }else{
           function a() {
              alert("2");
           }
       }
}

我們本來想讓if成立的時候彈出1,不成立彈出2

但是因為js會預解析,所以永遠都是彈出2;但是使用函式表示式就可以避免這種情況

window.onload = function () {
       if(true){
           var a = function() {
               alert("1");
           }
       }else{
           var a = function() {
              alert("2");
           }
       }
       a();
 }

因為函式表示式不會被預解析,所以會按正常的邏輯進行,自然就彈出的是1

所以記住: 在寫程式的時候,如果需要根據不同的條件判斷 來決定執行不同的函式,那麼此時一定要用“函式表示式”的形式來定義函式。這樣可以避免很多錯誤發生

相關推薦

js的變數宣告函式宣告提升

首先我們需要知道JS解析的兩個階段:預處理、執行期,本次來談談預處理階段。 預處理階段:JS會對程式碼中所有用var宣告的變數和函式宣告進行處理,將其提前。 注:其中變數也只是進行了宣告並未進行初始化以及賦值。 變數: 來個簡單的例子: console.log(a); var a

JS函式-函式宣告函式表示式之間恩怨

“函式宣告”和“函式表示式”其實說白了 就是定義函式的方式 函式宣告: function 函式名(){.....}通過上面方式定義的函式就是函式宣告 函式表示式:通過函式表示式定義函式的方式比較

JS-函式宣告 函式表示式

    問題:       1, function foo() {};            2, var foo = function () {};   1,上面的語法是宣告,

JS函式宣告函式表示式的區別

    另一方面,仔細看一看產生規則也會發現,唯一可能讓Expression(表示式)出現在Block(塊)中情形,就是讓它作為ExpressionStatement(表示式語句)的一部分。但是,規範明確規定了ExpressionStatement(表示式語句)不能以關鍵字function開頭。而這實際上就是

函式宣告函式表示式之間的區別

 函式表示式是javascript中的一個既強大容易令人困惑的特性           《javascript高階程式設計》 定義函式的方式有兩種 //指定函式名的方式1.function  sayHi(){ } 以上的函式宣告方式一個重要的特徵就是函式宣告提升,意思是在執行程式碼之前會先讀取函式宣告,意味著

JS函式宣告函式表示式的區別

review專案程式碼時,不同JS檔案之間在沒有相互引用的情況下,可以使用對方的方法,上網查了一下原因如下:在<body>標籤結束之前以下面的方式引入兩個js檔案<script src="a.js"></script> <script

eval及函式宣告函式表示式

1,eval:將一個物件行使額字串轉換為物件 { name: 'Jim' ,age :19}==>語法錯誤 //使用()將其轉化成表示式,{}不再是語句塊了,就是物件了 ->var o= eval( "( { name : 'Jim' ,age :19 } )"} //在js中有

函式宣告函式表示式——函式宣告宣告提前

定義函式的方法主要有三種: 1、函式宣告; 2、函式表示式; 3、new Function建構函式 函式宣告的經典格式: function functionName(arg1,arg2,...){...} 函式表示式: var variable = functi

javascript中函式宣告函式表示式的區別

1.js中函式表示式的定義 表示式(expression)JavaScript中的一個短語,javascript會將其計算(evaluate)出一個結果。程式中的常量是一個最簡單的表示式。變數名

函式宣告函式表示式

建議使用函式宣告代替函式表示式,原因: 函式宣告是可命名的,所以他們在呼叫棧中更容易識別。此外,函式宣告會把整個函式提升(hoisted),而函式表示式只會把函式的引用變數名提升。這條規則使得箭頭函式

javascript的執行順序/函式宣告函式表示式的區別

例子: function myfunc () { alert(”hello”); }; myfunc(); //這裡呼叫myfunc,輸出yeah而不是hello function myfunc () { alert(”yeah”); }; myfunc(); //這裡呼叫

函式宣告函式表示式區別

定義函式的方法 定義函式的方法主要有三種: 函式宣告(Function Declaration)函式表示式Function Expression)new Function建構函式 其中,經常使用的是函式宣告和函式表示式的函式定義方法,這兩種方法有著很微妙的區別和聯絡,而

詳解Javascript 函式宣告函式表示式的區別

Javascript Function無處不在,而且功能強大!通過Javascript函式可以讓JS具有面向物件的一些特徵,實現封裝、繼承等,也可以讓程式碼得到複用。但事物都有兩面性,Javascript函式有的時候也比較“任性”,你如果不瞭解它的“性情”,它很

JavaScript函式宣告函式表示式區別

在定義函式時,我們一般使用下面這兩種方法: 用函式宣告建立的函式:    function a() {    }用函式表示式建立的函式:    var b = function() {    }當我們執

函式宣告表示式

//解析器在向執行環境中載入資料時,對函式宣告和函式表示式並非一視同仁。解析器會率先讀取函式宣告,並使其在執行 //任何程式碼之前可用(可以訪問);至於函式表示式,則必須等到解析器執行到它所在的程式碼行

js學習(16)----函式宣告函式作為引數

1.函式宣告和函式表示式 函式宣告需要被呼叫才會執行相應的內容,而函式表示式則相當於呼叫了函式。 如下: // 這是函式宣告,沒有看到;號 function sum(num1, num2) { // 函式體 } // 這是函式表示式 var

在變數作用域方面,函式宣告函式表示式有什麼區別?

函式宣告提升,在函式宣告時定義好作用域; 函式表示式,只是變數名提升,隨著變數的改變,作用域也改變。 詞法環境with,和try…catch…不會影響函式宣告的變數作用域,但會影響函式表示式的變數作

javascript立即執行函式函式宣告函式表示式

javascript和其他程式語言相比比較隨意,所以javascript程式碼中充滿各種奇葩的寫法,有時霧裡看花,當然,能理解各型各色的寫法也是對javascript語言特性更進一步的深入理解。( function(){…} )()和( function (){…} () )

函式宣告函式表示式的區別

題 1: functionfoo(){ functionbar(){ return3; } returnbar(); functionbar(){ return8; } } alert(foo());

Javascript 函式宣告函式表示式的區別

  Javascript Function無處不在,而且功能強大!通過Javascript函式可以讓JS具有面向物件的一些特徵,實現封裝、繼承等,也可以讓程式碼得到複用。但事物都有兩面性,Javascript函式有的時候也比較“任性”,你如果不瞭解它的“性情”,