簡體   English   中英

if塊是否在函數范圍內創建新的局部范圍?

[英]Does if block create a new local scope inside a function scope?

例如:

function example() {
   console.log("outside the if block above function b declaration"+b()); 
  function a() {
   return "you invoked function a";
  } 
  if (true) {
    console.log("inside the if block"+a());
    console.log("inside the if block above function b declaration"+b());
    function b() {
      return "you invoked function b";
    } 
  }
}

當我調用這個example()函數時,我得到一個錯誤,b是未定義的,但當我刪除第二行調用函數b在if塊中定義時它都可以嗎?

是的,不是。 關鍵字let支持塊中的本地范圍。 關鍵字functionvar適用於功能級別范圍。 它們在執行之前編譯塊時定義一個標識符。 所以你通常可以調用聲明之上的函數。

在您的示例中,函數是有條件地聲明的。 評估條件之后和執行內部塊之前 ,它將被聲明。 但是當它被聲明時,它在整個函數的范圍內是有效的。 嘗試移動if-block下面的invokation,它將被知道並執行。

不,不是的。 如果塊仍然限制在其容器中。 您的函數B未定義,因為定義它的代碼在被if語句阻止時永遠不會被執行。 但是,一旦刪除了if語句,就會執行定義函數的代碼,定義函數。

這是一個展示這個概念jsfiddle

function defining() {
    ifstmt = true;
    if(ifstmt) {
        var ifscope;
        ifscope = "yes";
    }
    console.log(ifscope); // logs "yes"
}

function notDefining () {
    ifstmt = false;
    if(ifstmt) {
        var ifscope;
        ifscope = "no";
    }
    console.log(ifscope); // logs undefined
}

defining()
notDefining()

defining()變量ifscope被定義但顯然不限於if語句的范圍。 notDefining() ,定義ifscope的代碼被跳過,因此console.log返回undefined。

正如Michael.Lumley在答案中指出的那樣,通常需要在代碼執行之前定義某些內容的代碼。 但是,Javascript支持“hoisting”,它使編碼器能夠在定義之前調用一段代碼。(更多關於吊裝 - https://developer.mozilla.org/en-US/docs/Glossary/Hoisting )因此遵循代碼工作得很好:

example()
function example() {
  console.log("outside the if block above function b declaration"+b()); 
  if (true) {
    console.log("inside the if block"+a());
    console.log("inside the if block above function b declaration"+b());
  }
}
function a() {
   return "you invoked function a";
  }
function b() {
      return "you invoked function b";
    } 

這是jsfiddle - https://jsfiddle.net/px2ghrgy/

但是,你的代碼顯然不會起作用,因為它似乎是條件,不支持這樣的提升。 原因是范圍,即,雖然函數在一個封閉范圍(全局或函數內)中提升,但它不會發生在條件(if / else)中。 您會發現此答案也相關 - > https://stackoverflow.com/a/35250887/7374117

暫無
暫無

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

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