簡體   English   中英

Javascript:函數聲明類型對setInterval和onComplete重要嗎?

[英]Javascript: function declaration type important for setInterval and onComplete?

我的問題基本上是對此的擴展: var functionName = function(){}與function functionName(){} 我已經閱讀了所有答案,但我認為我仍然缺少此問題的答案:

為什么函數聲明的類型對jQuery的onComplete事件和本機setInterval方法很重要? 而且,為什么對這些無關緊要,但對於普通的addEventListener卻無關緊要?

onComplete事件的示例(假設blinkOn() ):

//like this the onComplete event works normally and the functions call eachother
function blinkOn() { $blink.fadeIn( 500, blinkOff ); }
function blinkOff() { $blink.fadeOut( 500, blinkOn ); }

//like this blinkOff won't be called after the fadeIn
function blinkOn() { $blink.fadeIn( 500, blinkOff ); }
var blinkOff = function() { $blink.fadeOut( 500, blinkOn ); };

setInterval的示例:

//works fine
var timer = setInterval( onTimer, 700);
function onTimer() { ... }

//won't work
var timer = setInterval( onTimer, 700);
var onTimer = function() { ... }

我想知道的原因是因為我想要代碼的一致性。 如果唯一的方法就是使用function a() { ... } ,那就可以了。 但是我認為var a = function() { ... }在定義范圍方面更為清晰。 我真的很好奇。

如果要在調用函數的位置上方定義函數,則不會有問題。

var toggleLight = function(){light =!light; };

setInterval(toggleLight,500);

您的問題是您正在嘗試訪問尚不存在的事物。

這與嘗試執行此操作完全相同:

var c = a + b,

    a = 12,
    b = 3;

當程序點擊cab不存在。

對於每個功能,將其視為三個步驟進行:

var a = 12,
    b = 3,
    c = add(a, b);

function add (a, b) { return a + b; }

第1步。
引擎抓取命名函數add並確定其功能(首先定義所有命名函數)。

第2步。
引擎在函數中找到所有變量,並將它們設置為undefined

var a = undefined,
    b = undefined,
    c = undefined;

function add(a, b) { return a + b; }

步驟3。
引擎按順序初始化所有變量。

// 3.1
var a = 12,
    b = undefined,
    c = undefined;


// 3.2
var a = 12,
    b = 3,
    c = undefined;

// 3.3
var a = 12,
    b = 3,
    c = add(a, b); // = return a + b = 15

所以做這樣的事情:

callFunction(myFunc);
var myFunc = function () {};

等於這個:

var myFunc = undefined;
callFunction(myFunc);
myFunc = function () {};

解:

將實施與行動分開。 在調用任何內容之前,請確保已定義所有內容。

命名函數是在任何地方創建的,因此它們在定義它們的范圍內變得全局可用,因為分配給標識符的匿名函數僅在定義了綁定到標識符的標識符后才可用。

因此,您遇到的是一個簡單的競爭條件問題。 如果在blikOff變量定義之后調用blinkOn()則第一個無效示例應該可以使用。

您的第二個無效示例不起作用,因為在調用setInterval onTimer 將變量定義setInterval調用之前,它將起作用。

//like this blinkOff won't be called after the fadeIn
function blinkOn() { $blink.fadeIn( 500, blinkOff ); }
var blinkOff = function() { $blink.fadeOut( 500, blinkOn ); };

它將被調用。 您只需要確保在分配之前(上方)未調用 blinkOn (被引用就可以)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM