摘要:函數和變量聲明總是用這樣的方式被提升,變量的賦值將在代碼中的任何位置出現。然而,這里輸出的是就是這個原因我認為變量聲明沒有提升。變量聲明在函數聲明之后或者下面被提升。這是個關于變量提升的簡單又又明確例子這被理解為現在明白了。
2017年的事情還是2017年完成吧。話不多說,現在開始:
之前翻譯過兩篇發(fā)表在Medium上的兩篇文章,關于變量和函數提升的問題。后來發(fā)現,一個讀者(Gavin Orland)與作者(Bhuvan Malik)就函數和變量提升的問題產生了分歧,是留言形式的。最后作者還專門又寫了一篇文章來回應問題,我想也是想讓大家都看見吧。所以我自己整理一下,現將他們的討論也做一個搬運吧。
Gavin Orland 與 Bhuvan Malik 就提升話題中“問題1”和“問題3”的討論Gavin Orland:
Explanations 1 and 3 are slightly incorrect as function declarations are actually hoisted above variable declarations.
解釋1和3有點不正確,實際上函數聲明實際上是在變量聲明之上提升的。
Bhuvan Malik:
For the first question’s behind the scenes, I have purposely shown the effects of hoisting only inside the functional scope of b().
對于第一個問題,我刻意僅在b()的功能范圍內展示了提升的效果。
As for the third question, var hoisted = “I’m a variable”; comes first and therefore the variable “hoisted” should be hoisted first with an “undefined” value. I could be wrong in which case you can point me to a source which proves me wrong, in which case I’d be happy make the change. ?
第三個問題:var hoisted = “I‘m a variable’”; 因此首先應該提升“提升”的變量,并且具有“undefined”的值。我可能是錯的,在這種情況下,你可以指出我的來源,證明我錯了,在這種情況下,我會很高興做出改變。?
Gavin Orland:
Here’s what goes on behind the scenes for explanation 3:
function parent() { // Function declaration hoisted first function hoisted() { return "I"m a function"; } // Variable re-assigned (declaration ignored) hoisted = "I"m a variable"; return hoisted(); } console.log(parent());
Here’s a source for this.
源碼在這里。
Bhuvan Malik:
What you’re trying to say is correct. However, saying that function declarations get hoisted “above” variable declarations, which implies that variable declarations “get hoisted below” is wrong. In such a case, what is happening is that the hoisting of var declarations simply gets ignored. I will update this. ?
你想證明你說的是對的。然而說函數聲明提升在變量聲明提升之上,在暗示變量聲明“提升在下面”是錯的。在這樣的情況下,發(fā)生的事情就是簡單地忽略var聲明的提升。 我會更新這個。?
Gavin Orland:
I’m not “trying” to say anything, I’m simply saying it: function declarations are hoisted above variable declarations. What is unclear about that? Yes, therefore variable declarations are then logically hoisted below function declarations, if you want to think about it like that. It is not wrong to say that?—?please prove to me that is wrong.
我沒有試著說什么,我只是在說:函數聲明被提升到了變量聲明之上。有什么不清楚的呢?是的,因此變量聲明在函數聲明下面邏輯地提升,如果你覺得他是這樣,那樣說也沒錯--請向我證明我是錯的。
In your first reply you said:
在你第一次回復中你說:
var hoisted = “I’m a variable”; comes first and therefore the variable “hoisted” should be hoisted first with an “undefined” value
This is incorrect?—?a declaration will be hoisted after the function with this value. Then the string value is immediately assigned to it.
這是錯的-- 一個聲明將在具有這個值的函數之后被提升。然后,字符串值立即分配給它。
Indeed, in the case of example 3, the declaration is ignored (in contradiction to your explanation), as I explained, because the variable has already been declared in the form of the function, but in other cases (such as example 1, which you do not want to correct) function declarations are hoisted first, then variable declarations.
確實,在案例3的情況中,這個聲明被忽略(與你的解釋相矛盾),正如我所解釋的,因為變量已經以函數的形式被聲明了,但在其他情況(如示例1,您不想糾正)函數聲明首先被提升,然后是變量聲明。
Function and variable declarations are always hoisted in this manner, the assignment to the variable will take place wherever it appears in the code.
函數和變量聲明總是用這樣的方式被提升,變量的賦值將在代碼中的任何位置出現。
It’s odd you should accept my correction and then somehow claim you are right and I am wrong?! Anyway, I see you have now corrected the article (otherwise very good, and thanks for writing it).
這很奇怪,你應該接受我的更正,然后以某種方式聲稱你是對的,我錯了?無論如何,我看你現在已經糾正了這篇文章(其他的非常好,謝謝你寫了這些)。
Bhuvan Malik:
First of all, thanks for correcting me sir and I appreciate your explanations. You say that variable declaration will get hoisted after the function with an “undefined” value, and then the string value will be immediately assigned. My doubt here is that what if we only have the variable declaration without a string value being assigned like so:
首先,感謝先生糾正我,我感謝你的解釋。你說那個變量聲明在函數之后被賦值“undefined”,然后字符串值將立即分配。這里我的疑問是,如果我們只有變量聲明沒有被賦值的字符串值,如下所示:
function parent() { var hoisted; function hoisted() { return "I"m a function"; } return hoisted(); } console.log(parent());
If variable declaration does get hoisted after the function, then behind the scenes for this according to your explanation should be:
如果變量聲明在函數之后被掛起,那么根據你的解釋,這個后臺應該是:
function parent() { // Hoisted first function hoisted() { return "I"m a function"; } // Hoisted second with a value of undefined var hoisted; return hoisted(); } console.log(parent());
If the variable declaration is indeed hoisted second, then hoisted should finally get the value of “undefined” after the hoisting of the function and the program should finally throw an error because hoisted is no longer a function.
如果變量聲明確實是第二次提升的話,那么在提升函數后最終得到的值是“undefined”,程序最終會因為提升函數而拋出一個錯誤。
However, the output still comes out to be “I’m a function”.
然而,這里輸出的是“I’m a function”
This is the reason why I think there is no variable declaration hoisting happening here. I agree that a variable declaration hoisting in such a case simply gets ignored. Getting me?
Again, I could be wrong. I’m just trying to learn here by discussing with you.
就是這個原因我認為變量聲明沒有提升。 我同意,在這種情況下提交的變量聲明只是被忽略。 再聯(lián)系我?再次,我可能是錯的。 我只是想通過討論和你一起來學習。
Gavin Orland:
No problem, I can explain this. In fact I think we have already covered it, really.
沒問題,我能解釋這個。事實上我認為我們已經把它覆蓋了,真的。
Variable declarations are hoisted after (or below) function declarations. But, in the case where the names match function declarations (or any variable already declared), they have no effect, so are ignored.
變量聲明在函數聲明之后(或者下面)被提升。但是,在名稱匹配函數聲明的情況下(或任何已經聲明的變量),它們沒有效果,因此被忽略了。
So, redeclaring a variable does not render it undefined, it has no effect. Only re-assigning an already declared variable has an effect.
因此,重新聲明變量不能給與它“undefined”,這沒有效果。只能重新給一個已經聲明的變量分配才會有效果。
Here’s a simple but illuminating example of this variable hoisting, btw:
這是個關于變量提升的簡單又又明確例子:
console.log(x); // undefined var x = y; function y(){} console.log(x); // function y(){}
This is understood as:
這被理解為:
function y(){} var x; console.log(x); // undefined x = y; console.log(x); // function y(){}
Bhuvan Malik:
Got it now. Thank you so much!
現在明白了。 非常感謝!
以上就是這位讀者(Gavin Orland )和作者(Bhuvan Malik)之間的討論。還是得到些啟發(fā)。因為讀者給的源碼可是大名鼎鼎的《你不知道的JavaScript》里面的例子。我也算完成了搬運,好了~ 可以沒有欠債(我自己的債)的度過2017了。
Peace ??
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/90575.html
摘要:函數提升在里有兩種方式創(chuàng)建函數,通過函數聲明和函數表達式。函數聲明用指定的參數來定義函數。提示不要在中進行函數聲明。問題輸出兩個都是用函數聲明的函數,將被提升到的局部作用域頂端。函數本身將作為函數聲明在全局范圍內提升。 作者關于提升的話題,總共有兩篇。(后來又有一個討論篇),再次搬過來。水平有限,如果翻譯的不準確請包涵,并去看原文。下面開始: 這是我之前的關于提升的文章,標題為《用le...
摘要:前端每周清單專注前端領域內容,以對外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點分為新聞熱點開發(fā)教程工程實踐深度閱讀開源項目巔峰人生等欄目。背后的故事本文是對于年之間世界發(fā)生的大事件的詳細介紹,闡述了從提出到角力到流產的前世今生。 前端每周清單專注前端領域內容,以對外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點;分為新聞熱點、開發(fā)教程、工程實踐、深度閱讀、開源項目、巔峰人生等欄目。歡迎...
摘要:楊冀龍是安全焦點民間白帽黑客組織核心成員,被浪潮之巔評為中國新一代黑客領軍人物之一他在本文中依次分享了對于黑客的定義如何從黑客成為一名安全創(chuàng)業(yè)者技術創(chuàng)業(yè)踩過的坑給技術創(chuàng)業(yè)者建議等內容。 showImg(https://segmentfault.com/img/remote/1460000012377230?w=1240&h=796); 前端每周清單專注前端領域內容,以對外文資料的搜集為...
摘要:所以形式參數是本地的,不是外部的或者全局的。這叫做函數聲明,函數聲明會連通命名和函數體一起被提升至作用域頂部。這叫做函數表達式,函數表達式只有命名會被提升,定義的函數體則不會。 Scoping & Hoisting var a = 1; function foo() { if (!a) { var a = 2; } alert(a); }; ...
摘要:不同的是函數體并不會再被提升至函數作用域頭部,而僅會被提升到塊級作用域頭部避免全局變量在計算機編程中,全局變量指的是在所有作用域中都能訪問的變量。 ES6 變量作用域與提升:變量的生命周期詳解從屬于筆者的現代 JavaScript 開發(fā):語法基礎與實踐技巧系列文章。本文詳細討論了 JavaScript 中作用域、執(zhí)行上下文、不同作用域下變量提升與函數提升的表現、頂層對象以及如何避免創(chuàng)建...
閱讀 1814·2021-10-09 09:44
閱讀 2690·2021-09-22 15:38
閱讀 2451·2021-09-09 09:33
閱讀 686·2021-09-07 09:58
閱讀 1786·2021-09-02 15:41
閱讀 2485·2019-08-30 15:55
閱讀 1796·2019-08-30 15:55
閱讀 533·2019-08-30 15:44