1.函數聲明和函數表達式有什么區別
- 函數聲明,使用Function關鍵字可以聲明一個函數
function sayHello(){
console.log("hello")
}
sayHello()
- 函數表達式,使用var之類的關鍵字定義
var sayHello =function(){
console.log("hello")
}
sayHello()
區別:函數聲明中,聲明不必放在調用的前面;函數表達式中,聲明必須放在調用的前面。
2.什么是變量的聲明前置?什么是函數的聲明前置
在一個作用域下,var 聲明的變量和function 聲明的函數會前置
console.log(a);
var a = "chen";
在這過程中,變量的聲明會前置,變成
var a; // 結果undefined
console.log(a);
a = "chen";
這就是為什么單獨輸入console.log(a);
會報錯,但再后面加上var聲明變量,可以顯示結果。
test
function 聲明的函數會前置,先聲明后運算。
3.arguments 是什么?
在函數內部,你可以使用arguments對象獲取到該函數的所有傳入參數,也可以相應地選擇一些參數。
test
4.函數的"重載"怎樣實現?
- 針對其他強類型的語言,函數名雖然重復,但變量的類型是固定的,如數值類型對應int,字符串對應string。
-
對js來講,沒有重載! 同名函數會覆蓋。 但可以在函數體針對不同的參數調用執行相應的邏輯
同名函數覆蓋
5.立即執行函數表達式是什么?有什么作用?
一般的
function sayHello(name){
console.log("hello"+name)
}
sayHello("css")
立即執行函數表達式
(function sayHello(name){
console.log("hello"+name)
})("css")
作用:隔離作用域;省略函數名;包裹模塊,避免污染全局變量
6.求n!,用遞歸來實現
function factor(n) {
if(n<=0){
return console.log('n不可小于或等于0')
}
if(n==1){
return n
}
return n*factor(n-1)
}
7
1.當執行getInfo('饑人谷', 2, '男');
時
function getInfo(name, age, sex){
console.log('name:',name); // name:饑人谷
console.log('age:', age); // age:2
console.log('sex:', sex); // sex:男
console.log(arguments); // ['饑人谷', 2, '男']
arguments[0] = 'valley'; //(arguments[0] 值為 '饑人谷', 將 'valley'值賦值給'饑人谷')
console.log('name', name); // name,valley
}
2.當執行getInfo('小谷', 3);
時
function getInfo(name, age, sex){
console.log('name:',name); // name:小谷
console.log('age:', age); // age:3
console.log('sex:', sex); // sex: undefined
console.log(arguments); // ['小谷', 3]
arguments[0] = 'valley';
console.log('name', name); // name,valley
}
3.當執行getInfo('男');
時
function getInfo(name, age, sex){
console.log('name:',name); // name:男
console.log('age:', age); // age: undefined
console.log('sex:', sex); // sex: undefined
console.log(arguments); // ['男',undefined,undefined]
arguments[0] = 'valley';
console.log('name', name); // name,valley
}
8
function sumOfSquares(){
var sum=0;
for(var i=0;i<arguments.length;i++) {
sum+=arguments[i]*arguments[i];
}
return sum
}
sumOfSquares(2,3,4)
sumOfSquares(1,3)
9
console.log(a); //var=a,變量聲明前置,但未賦值,結果顯示為undefined。
var a = 1;
console.log(b); //出現報錯,`b is not defined`
10
sayName('world');
sayAge(10);
function sayName(name){
console.log('hello ', name);
} //Function聲明的函數前置,執行sayName('world'),結果:hello,world
var sayAge = function(age){
console.log(age);
}; //結果出現報錯,原因:函數表達式必須放在聲明的前面。
11
1.globalcontext={
AO:{
x:10
foo:function
bar:function
},
scope: null
}
聲明foo時得到下面
foo.[[scope]]=globalcontext.AO
聲明bar時得到下面
bar.[[scope]]=globalcontext.AO
2.執行bar時產生下面
barcontext={
AO:{
x:30
},
Scope: bar.[[scope]] =globalcontext.AO
}
3.執行foo時產生下面
foocontext={
AO:{},
Scope: foo.[[scope]] = globalcontext.AO
}
**最終結果為`console.log(10)`,為10**
12
1.globalcontext={
AO:{
x:10
bar:function
},
Scope:null
}
聲明bar時得到:bar.[[Scope]]=globalcontext
2.執行bar時產生下面
barcontext={
AO:{
x:30
foo:function
},
Scope:bar.[[Scope]]=globalcontext
}
Scope:foo.[[Scope]]=barcontext
3.執行foo時產生下面
foocontext={
AO:{},
Scope:foo.[[Scope]]=barcontext
}
console.log(10)結果為10
13
1.globalcontext={
AO:{
x:10
bar:function
}
}
聲明bar時產生bar.[[Scope]]=globalcontext.AO
2.barcontext={
AO:{
x:30
(function)
}
}
Scope:(function).[[Scope]]=barcontext.A0
3.(function)context={
AO:{}
Scope:(function).[[Scope]]=barcontext.A0
}
4.最終結果console.log(30),結果為30
14
1.globalcontext={
AO:{
a:1
fn:function
fn3:function
},
}
fn.[[Scope]]=globalcontext.AO
fn3.[[Scope]]=globalcontext.AO
2.fncontext={
AO:{
聲明前置var=a
console.log //undefined
a=5
console.log //5
a:6(a++后)
(fn3、fn2開始執行)
fn2:function
}
fn2.[[Scope]]=fncontext.AO
}
3.fn3context={
AO:{}
console.log //1(來著于globalcontent.AO)
}
a=200聲明, //globalcontent.AO中的a為200
4.fn2context={
AO{}
console.log //6(來著于fncontext.AO)
}
a=20聲明 //fncontext.AO中的a為20
執行console.log //20
}
5.fn運算結束,執行console.log,結果為200
運行fn2
6.結果依次為:undefined、5、1、6、20、200