js作用域面試題
1.var a=12;
function fn(){
console.log(a) //12
a=45
console.log(a) //45
}
fn()
畫圖分析
2.var a=12
function fn(){
console.log(a) //undefined
var a=45
console.log(a) //45
}
fn()
案例解析畫圖:
3. 函式遞迴(函式自己內部自己呼叫自己)
function fn(){
xonsole.log(5)
fn()
fn()
畫圖解析
4.function fn(){
console.log(11)
function ff(){
console.log(22)
}
ff()
}
fn() //11 22
ff() //xxx.is not defined
畫圖解析:
5.function fn(){
console.log(12)
}
var as=fn()
console.log(as) //每個函式都有自己的返回值,return,return是什麼就返回什麼,如果沒有就是undefined
畫圖解析
6.var a=12;
function fn(){
console.log(a) //undefined
return 4
var a=45
}
fn()
畫圖解析:
7.var a=45
function fn(a){
console.log(a) //undefined
}
fn()
畫圖解析:
8.var a=123
function fn(){
alert(a) //123
}
fn()
畫圖解析:
9.var a=123
function fun(){
alert(a)
var a=456
}
fun() //undefined
alert(a) //123
畫圖解析:
10.var a=123
function fun(){
alert(a)
a=456
}
fun() //123
alert(a) //456
畫圖解析:
11.var a=123
function fun(a){
alert(a)
a=456
}
fun() //undefined
alert(a) //123
畫圖解析:
12.var a=123
function fun(a){
alert(a)
a=456
}
fun(123)
alert(a)
畫圖解析:
形參於實參的區別:
形參:相當於一個私有變數,
實參:對形參的賦值,如果是數字,則直接對形參賦值,如果是字母,則會通過作用域鏈查詢字母的賦值情況,然後給形參傳參,如果沒有,則意味著執行模組沒有對形參賦值的情況,就需要通過形參來向上查詢
13.console.log(totai) //undefined
var total=0;
function fn(num1,num2){
console.log(total) //undefined
var total=num1+num2
console.log(total) //300
}
fn(100,200)
console.log(total) 0
畫圖解析:
14.var to=1;
function fn(n1,n2){
console.log(to)
to=n1+n2
console.log(to)
fn(10,20)
console.log(to)
畫圖解析:
15.function fn(a){
console.log(a)
var a=123
console.log(a)
function a(){}
console.log(a)
var b=function(){}
console.log(b)
function d(){}
}
fn(1)
畫圖解析:
如果形參,宣告變數,函式名同名時,在預解釋的時候只宣告一次,其他的都是在賦值時後面會把前面的覆蓋掉
權重為 形參<宣告變數<函式名
16.function test(a,b){
console.log(b) //function b(){}
console.log(a) //1
c=0;
var c;
a=3;
b=2;
console.log(b) 2
function b(){}
function d(){}
console.log(b) 2
}
test(1)
畫圖解析:
17.function test(a,b){
console.log(a)
console.log(b)
var b=234
console.log(b)
a=123;
console.log(a)
function a(){}
var a
b=234
var b=function(){}
console.log(a)
console.log(b)
}
test(1)
畫圖分析:
18. 銷燬案例 (閉包)
function fn(){
var a=12;
a++
console.log(a)
}
fn() 13
fn() 13
fn() 13
畫圖解析:
19.解決辦法
function fn(){
var a=12
return function(){
a++
console.log(a)
}
}
var ss=fn()
ss()
ss()
ss()
20.+function(){
var a=5
function a(){}
alert(a) 5
function b(){}
b=6;
alert(b) 6
var c=d=b
}()
alert(d) 6
alert(c) is not defined
畫圖解析: