![](/img/trans.png)
[英]Create NPM Module where all Functions can Access Initialized variables
[英]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.