![](/img/trans.png)
[英]JavaScript hoisting for function expression and function declaration
[英]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.