簡體   English   中英

提升函數表達式

[英]Hoisting function expression

據我所知,只有函數表達式的聲明部分才會被提升而不是初始化。 例如:

var myFunction = function myFunction() {console.log('Hello World');};

所以“var myFunction;” 被提升,但“功能myFunction()......”沒有。

現在我的問題是,我使用google auth函數玩了一下:

"use strict";

$(document).ready = (function() {
  var clientId = 'MYCLIENTID';
  var apiKey = 'MYAPIKEY';
  var scopes = 'https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/drive.readonly https://www.googleapis.com/auth/drive.appfolder https://www.googleapis.com/auth/drive.apps.readonly https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/drive.install https://www.googleapis.com/auth/drive.metadata https://www.googleapis.com/auth/drive.metadata.readonly https://www.googleapis.com/auth/drive.photos.readonly https://www.googleapis.com/auth/drive.scripts';

  $('#init').click(function() {
    gapi.client.setApiKey(apiKey);
    window.setTimeout(checkAuth(false, handleAuthResult), 1);
  });

  var checkAuth = function checkAuth(imm, callback) {
    gapi.auth.authorize({
      client_id: clientId,
      scope: scopes,
      immediate: imm
    }, callback);
  };

  var handleAuthResult = function handleAuthResult(authResult) {
    if (authResult) {
      gapi.client.load('drive', 'v2', initialize);
    } else {
      $('#progress').html('Anmeldung fehlgeschlagen');
    }
  };

  // Other code
})();

在第10行“window.setTimeout(checkAuth ...”我調用checkAuth函數,該函數在此函數調用下面聲明。我的假設是我收到錯誤說“... checkAuth不是函數/未定義等等。 “但是它確實有效。有人可以向我解釋一下嗎?

這是因為當觸發元素上的實際click事件時, checkAuth 隨后在范圍中可用。 您預期的錯誤將以這種方式發生:

checkAuth(false, ...); // the symbol is available, but...

// its value is assigned here
var checkAuth = function checkAuth() {
    /* more code */
};

注意在上面的代碼片段中分配之前立即調用checkAuth()

什么可以在調用點被命名為符號 checkAuth ; 但是,它的價值會在稍后分配。 因此,錯誤checkAuth不是函數,而是checkAuth未定義

聲明命名函數不同於將函數賦值給變量。 本文通過示例詳細闡述了這一點。 為了完整起見,我在這里引用重要部分:

我們首先需要理解函數表達式和函數聲明之間的區別。 顧名思義,函數表達式將函數定義為表達式的一部分(在本例中將其賦值給變量)。 這些功能可以是匿名的,也可以有名稱。

...函數聲明始終定義為命名函數,而不是任何表達式的一部分。

...函數表達式只能在定義之后調用,而函數聲明可以在定義之前和之后執行

如果刪除函數名,您將收到預期的錯誤:

 var checkAuth = function(imm, callback) {
    gapi.auth.authorize({
      client_id: clientId,
      scope: scopes,
      immediate: imm
    }, callback);
  };

另外,您似乎錯誤地使用了setTimeout:

window.setTimeout(checkAuth(false, handleAuthResult), 1);

將立即執行checkAuth而不是延遲它,如果你想延遲checkAuth的執行,你可以將它包裝在一個匿名函數中:

window.setTimeout(function() { checkAuth(false, handleAuthResult) }, 1);

暫無
暫無

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

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