文中部分demo源自網上。
//demo1
function test(){
var num = 123;
console.log(num); //123
}
test();
console.log(num); //error
//demo2
var str= “我是Global”;
test();
function test() {
console.log(str); //undefined
var str= "哈哈哈”;
console.log(str); //“哈哈哈"
}
console.log(str); //“我是Global”
//demo3
function test(){
if("a" in window){
var a = 10; //提升到函數作用域最前 if語句沒有作用域
}
console.log(a); //undefined
}
test();
//demo4
if("a" in window){
var a = 10; //if沒有作用域,if提升到最前面,window中有a
}
console.log(a); //10
//demo5
if(!"a" in window){
var a = 10; //變量提升,沒有進入判斷語句
}
console.log(a); //undefined
//demo6
var foo = 1;
function bar() {
if(!foo) {
var foo = 10;
}
console.log(foo); //10
}
bar(); //申明foo -> 申明bar -> 賦值foo=1 -> 調用bar() -> 申明foo(函數體內) -> 賦值foo(函數體內)
//demo7
var foo;
function bar() {
var foo;
if(!foo){
foo = 10;
}
console.log(foo); //10
}
foo = 1;
bar();
//demo8
1. function bar() {
2. return foo; //return 在foo賦值之前,若在foo賦值之後,則被重寫爲number類型
3. foo = 10;
4. function foo() {}
5. var foo = 11;
6. }
7. alert(typeof bar());//function
//demo9
var a=100;
function a(){
console.log(a);
}
a(); //a is not function 變量和函數重名時,函數優先級更高 a後賦值爲100重寫了a
//demo10 形參與變量申明重名
function ab(x){
console.log(x);
var x = 4;
console.log(x);
};
ab(3); // 3 4 在函數中申明的變量被賦值後,頂替原來的形參,若申明沒賦值,則值還是形參的值
//demo11函數中申明的函數與形參重名
function ab(x){
console.log(x);
function x(){
console.log("我是函數")
};
console.log(x);
};
ab(3); //function x(){console.log(“我是函數”)} function x(){console.log(“我是函數")}
若文中有不對之處,敬請指出。