簡體   English   中英

為什么要為變量分配一個函數而不是聲明一個命名函數?

[英]Why would you assign a function to a variable instead of declaring a named function?

我為什么要這樣做:

var myfunc = function() { /* code */ };

...

myfunc();

代替這個:

function myfunc() { /* code */ }

...

myfunc();

相對於其他使用,有什么好處嗎? 我已經看到了在不同地方使用的兩個示例。

據我所知,唯一的區別是匿名函數不能遞歸調用自身,而命名函數可以。 結合了這三種的構造是第三種類型,即可以有一個命名函數表達式:

var myfunc = function myfunc() { /* code */ };

如果正常聲明了一個函數,則即使重新聲明了該標識符,該函數名(其標識符)也將不可刪除。 該標識符僅在其作用域結束時才會被刪除。

function myfunc() { /* code */ };

if (delete myfunc) { //will fail
  alert('myfunc deleted');
} else {
  alert('can not delete myfunc');
}

myfunc = null;

if (delete myfunc) { //will still fail
  alert('myfunc deleted');
} else {
  alert('can not delete myfunc');
}

var myfunc = null;

if (delete myfunc) { //will still fail
  alert('myfunc deleted');
} else {
  alert('can not delete myfunc');
}

但是,如果將函數聲明分配給變量,則可以刪除其標識符。 當您需要創建全局函數而僅臨時使用它時,此功能特別有用,以便可以在不再需要它時將其刪除,或避免可能的標識符與第三方腳本沖突。

var myfunc = function() { /* code */ };

if (delete myfunc) { //will succeed
  alert('myfunc deleted');
} else {
  alert('can not delete myfunc');
}

//or...
var myfunc = function myrealfunc() { /* code */ };

if (delete myfunc) { //will succeed
  alert('myfunc deleted');
} else {
  alert('can not delete myfunc');
}

有一些差異,大多數是實用的。 當您“變”一個函數時,通常的假設是某種“局部”范圍的函數(以嵌套函數為例)。 當您執行function myFunction() {} ,通常假定該函數是全局范圍的(盡管您也可以將其包裝在匿名函數中)。

對於javascript“類”,如果要創建本地范圍內的函數,則必須使用“ var”進行聲明。

var myClass = function() {
 var test = function() {
  //This function has local scope
  }
};

除了上述注釋之外,這是一個簡單的示例。

  var myVariable = resultFunction();


  function resultFunction() {
  return 1;
  }

上面的代碼將起作用。 但是您不能執行以下操作

 var myVariable = resultFunction();


 var resultFunction = function() {
    return 1;
 };

但是你可以做

 var resultFunction = function() {
    return 1;
 };

 var myVariable = resultFunction();

暫無
暫無

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

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