[英]JavaScript “this.variable” returns undefined in one instance, but not another
[英]JavaScript variable with no initial value returns null in one case and undefined in another
因此,我正在學習JavaScript並測試了以下代碼:
var name;
console.log( name );
返回null
var c;
console.log( c );
返回undefined
為什么是這樣?
文檔狀態: A variable declared using the var statement with no initial value specified has the value undefined.
任何對官方文檔的引用都很棒!
如果在瀏覽器中執行此操作,這是因為name
已經存在於瀏覽器環境中(這是窗口的名稱)。 因此var name
是no-op。 但請參閱下文, null
位讓我感到驚訝。
在JavaScript中,全局變量實際上是全局對象的屬性。 全局對象是值this
在全球范圍內的代碼*。 在瀏覽器中,全局對象是該頁面的瀏覽器的window對象,因此它具有為Window對象定義的任何屬性。 name
。 (另一個是window
,這是全局對象具有的屬性,該屬性具有對全局對象的引用,因此,即使不是在全局范圍內,也可以使用window
來引用它。)實際上,瀏覽器上的全局對象非常擁擠,因為瀏覽器傾倒在它的屬性對於具有任何元素id
(屬性名是id
,該值是對元素的引用),有forms
, all
在某些瀏覽器, document
,和一堆其他的東西。
在瀏覽器之外,全局對象沒有指向它的任何自動屬性(很好,除非環境添加了一個),並且它上沒有瀏覽器特定的東西(但可能與您所處的任何環境都有特定的東西)在)。
*除非你有"use strict"
在你的腳本,這使它在嚴格模式,在這種情況下的頂部this
是undefined
。
關於您在第一個示例中獲得null
作為輸出:我發現這非常令人驚訝; 我本來希望""
(一個空白字符串),或者,如果有的話,當然是窗口的名稱。 必須在某處某處為name
分配null
或"null"
(在我嘗試過的各種瀏覽器中,都可以將其設置為字符串"null"
[Chrome,Firefox,IE8,IE11])。 您可以在此頁面上嘗試(jsFiddle等為窗口提供名稱運行的窗口,因此在此示例中無法使用它們):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script>
(function() {
"use strict";
display("[before] typeof name: " + typeof name);
display("[before] name: " + name);
display("Doing <code>name = null;</code>");
name = null; // Gets coerced to string "null"
display("[after] typeof name: " + typeof name);
display("[after] name: " + name);
function display(msg) {
var p = document.createElement('p');
p.innerHTML = String(msg);
document.body.appendChild(p);
}
})();
</script>
</body>
</html>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.