簡體   English   中英

JavaScript奇怪的作用域行為

[英]Javascript Odd Scoping Behavior

我一直在研究Javascript函數范圍,並遇到了這個問題:

var scope = "global";

function f(){
    console.log(scope);

    var scope = "local";

    console.log(scope);
}

f();

現在,我知道第一個日志的輸出是“未定義”的,因為js如何在函數頂部提升變量。 但是,當我從“ var scope =“ local”;“中刪除var時 第一個日志輸出“ global”,這讓我抓狂了。 有人可以解釋為什么會這樣嗎? 我的意思是js不按順序運行代碼嗎? 這樣,如何刪除VAR會對第一個日志產生任何影響?

兩遍解析。 該代碼將被視為

function f() {
   var scope;  // var created, but no value assigned. this overrides the earlier global
   console.log(scope);
   scope = 'local';
   console.log(scope);
}

var的CREATION將被執行,就好像它是函數中執行的代碼的第一位一樣。 但是,實際的分配操作要到正常情況下才會發生。

JavaScript有時的行為與其他語言有些不同。 看看http://www.adequatelygoodgood.com/JavaScript-Scoping-and-Hoisting.html ,他們對此做了一些解釋。

如果省略var語句,則第一個日志使用全局變量,該變量由字符串“ global”設置。 沒有其他局部變量,也沒有提升。

  1. 第一個日志:設置了“全局”內容的全局變量范圍
  2. 為相同的全局變量分配新的字符串
  3. 第二條日志:設置了具有“本地”內容的全局變量范圍

暫無
暫無

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

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