[英]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
支持塊中的本地范圍。 關鍵字function
和var
適用於功能級別范圍。 它們在執行之前編譯塊時定義一個標識符。 所以你通常可以調用聲明之上的函數。
在您的示例中,函數是有條件地聲明的。 在評估條件之后和執行內部塊之前 ,它將被聲明。 但是當它被聲明時,它在整個函數的范圍內是有效的。 嘗試移動if-block下面的invokation,它將被知道並執行。
不,不是的。 如果塊仍然限制在其容器中。 您的函數B未定義,因為定義它的代碼在被if語句阻止時永遠不會被執行。 但是,一旦刪除了if語句,就會執行定義函數的代碼,定義函數。
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.