2016-09-28 35 views
0

我知道一個表達式不會「存在」,直到它被執行上下文達到。我只是想知道是否有任何區域使用函數表達式會比正常的函數語句更好,在這種語句中,您不必擔心函數何時會保存到內存中。在Javascript的函數語句中使用函數表達式的要點是什麼?

我完全知道他們是如何工作的,因爲我只是對錶達的用途感到好奇。

+4

另一個similiar問題也有很大的答案:http://stackoverflow.com/questions/336859/javascript-function-declaration-syntax-var-fn-function-vs-function -fn?rq = 1 – seahorsepip

+0

例如,當它們像箭頭函數一樣重要時 – Redu

+0

函數表達式在您只需要在一個地方使用該函數時很有用,因此不需要命名。 – Barmar

回答

5

函數表達式在幾種情況下是有用的:

當分配功能屬性:

SomeClass.prototype.myMethod = function(args) { 
    // implementation 
} 

當創建一個可以包含基於情況不同的實現變量:

var sortFn; 

if (high > low) { 
    sortFn = function(...) { 
     // sort increasing order 
    } 
} else { 
    sortFn = function(...) { 
     // sort decreasing order 
    } 
} 

// some code that uses sortFn() 

在IIFE(立即調用函數表達式):

var getUniqueID = (function() { 
    var counter = 0; 
    return function() { 
     return counter++; 
    } 
})(); 

console.log(getUniqueID()); // 0 
console.log(getUniqueID()); // 1 
console.log(getUniqueID()); // 2 

上有一個IIFE的有用許多其它參考文獻:

Javascript why wrap a variable or constructor in an IIFE?

What is the purpose of wrapping whole Javascript files in anonymous functions like 「(function(){ … })()」?

What is the (function() { })() construct in JavaScript?

What is the purpose of a self executing function in javascript?

Advanced Javascript: Why is this function wrapped in parentheses?

傳遞函數作爲參數內聯函數表達式:定義,你不會需要參考的回調函數,當

fetch(someURL).then(function(value) { 
    // this is inside a function expression 
}).catch(function(err) { 
    // handle errors here 
}); 

myArray.forEach(function(item, index) { 
    // process each item of the array here 
    // in this function expression 
}); 
+0

您忘記了最常見的情況:將回調作爲參數傳遞時。 – Bergi

+0

@Bergi - 添加了它。 – jfriend00

+0

@Ender - 我只是好奇,你爲什麼不接受這個答案?它缺少什麼? – jfriend00

2

一個這樣的應用可能是在後回調已被執行。例如,如果您使用的數組方法(如map或reduce)具有非常簡單的回調函數,則您可能不需要使用聲明。

var incrementValues = [1, 2, 3, 4, 5].map(function(val) {return val+1}); 

/// ===> incrementValues = [2, 3, 4, 5, 6]

+0

@ jfriend00所有「內聯」都是表達式。 – Bergi

相關問題