簡體   English   中英

為什么在函數中初始化的變量可以全局訪問?

[英]Why variables initialized in functions can be accessed globally?

當在函數范圍內初始化變量時,除了函數本身之外,其他任何人都無法訪問該變量。

為什么有時可以全局訪問函數中的變量初始化?

下面是一些代碼:


function sayHello() {
  a = 'hello';
  console.log(a);
 }
}

吊起后實際上變成這樣:

function sayHello() {
  var a; // undefined
  a = 'hello';
  console.log(a);
 }
}

sayHello() // outputs 'hello'
console.log(a) // Reference error: a is not defined.

在發生這種情況之前,一切都很好:


function sayGoodbye() {
  var b = 'Goodbye';
}

吊起來后實際上變成了這個

function sayGoodbye() {
  var b;
  b = 'Goodbye'
}

sayGoodbye() // undefined
console.log(b) // outputs 'Goodbye'

為什么在調用sayGoodbye之后,變量b可以全局訪問或在函數范圍之外訪問,而對sayHello來說,存在引用錯誤?

console.log是否與更改范圍有關?

如果您在不使用嚴格模式的情況下分配變量而未聲明,則它將成為全局變量。

function sayGoodbye() {
  b = 'Goodbye';
}

它成為了

var b;
function sayGoodbye() {
    b = 'Goodbye';
}

您的吊裝觀點不正確。 當您使用var 聲明變量時, 遇到變量時它將變為全局變量。 沒有提升該變量。 因此,如果您從不調用test ,則不會在全局范圍內定義變量。

 function test() { try { console.log("inside try", foo); } catch (e) { console.log("nope inside try: ", e.message); } console.log("test before", typeof foo) foo = "bar"; console.log("test after", typeof foo) } console.log('outside before called: ', typeof foo); console.log('does not exist example: ', typeof bar); try { console.log("outside try", foo); } catch (e) { console.log("nope outside try: ", e.message); } test(); console.log('outside after called: ', typeof foo); 

現在,如果您確實使用var聲明了變量,那么如果在聲明之前嘗試使用它,它將被吊起。

 function test() { // var foo; <-- it is hoisted to here try { console.log("inside try", foo); } catch (e) { console.log("nope inside try: ", e.message); } console.log("test before", typeof foo) var foo = "bar"; // line here acts like foo="bar" since declared at top with hoisting. console.log("test after", typeof foo) } console.log('outside before called: ', typeof foo); console.log('does not exist example: ', typeof bar); try { console.log("outside try", foo); } catch (e) { console.log("nope outside try: ", e.message); } test(); console.log('outside after called: ', typeof foo); 

暫無
暫無

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

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