2012-08-27 67 views
5

我在使用匿名函數進行javascript分析時存在一個主要問題,我總是有很多匿名函數 - 其中大部分都是回調函數 - 並且它使得我的分析器結果非常困難。使用命名函數進行回調

最後我決定使用命名函數回調,像這樣:

var f = function(callback) { 
    // Do something ... 
    callback(); 
} 

f(function named_function() { 
    console.log('Sample callback function!'); 
}); 

我想知道,我將有任何問題,讓我在這個代碼改變後? 而且這種類型的函數定義和傳遞會在任何地方保留名稱(named_function)嗎?

回答

8

該名稱將僅在指定函數表達式的作用域內可用。

但在IE 8及更低版本中存在問題。它會泄漏到外部作用域,並且實際上會創建一個不同的函數對象,所以如果這是一個問題,應該使其無效。

f(function named_function() { 
    console.log('Sample callback function!'); 
}); 
var named_function = null; 

請參閱本文的詳細信息:Named function expressions demystified

或者你可以創建這樣解決了IE瀏覽器的問題。

f(function() { 
    return function named_function() { 
     console.log('Sample callback function!'); 
    }; 
}()); 

但這有點難看。

0

如果您傳遞類似這樣的匿名函數,名稱將存在於函數本身內部。

它不會存在於任何其他範圍內。

var f = function(callback) { 
    // Do something ... 
    callback(); 
} 

f(function named_function() { 
    console.log(named_function); // Logs the function 
    console.log('Sample callback function!'); 
}); 

console.log(named_function);​ // Error: named_function is undefined 
0

在一個作用域中定義一個已命名的回調會導致它僅在該作用域中可見。因此,我會得出結論,不應該有任何命名衝突。例如,以下代碼按預期方式運行:

(function named_callback() { console.log("Callback 1"); })(); 
(function named_callback() { console.log("Callback 2"); })();​ 
0

實際上,您仍在創建匿名函數表達式並將其分配給本地作用域變量f。去

function f(callback) { 
    callback(); 
} 

f(named_function); 

function named_function() { 
    console.log('Sample callback function!'); 
} 

這樣的話,你甚至避免在< = IE8的命名的函數表達式內存泄漏,再加上因爲你不再創建函數表達式但*函數聲明,你甚至可以在體內訪問f

+0

我不會說這是一個匿名函數

僅舉功能。它不會在當前範圍內創建符號,但該函數有一個名稱:) –

1

您不必使事情複雜化。當你把它聲明

var foo = function foo(){};