函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別
- 函數(shù)聲明:使用function關(guān)鍵字聲明一個(gè)函數(shù)
- 函數(shù)表達(dá)式:聲明一個(gè)變量然后賦值為函數(shù)
- **
- 修改補(bǔ)充:
- 函數(shù)聲明有聲明前置的作用程帕,而函數(shù)表達(dá)式的賦值不能前置
什么是變量的聲明前置幕屹?什么是函數(shù)的聲明前置
- 變量的聲明前置:JavaScript引擎的工作方式是辕狰,先解析代碼绢慢,獲取所有被聲明的變量值朋,然后再一行一行地運(yùn)行腻贰。這造成的結(jié)果吁恍,就是所有的變量的聲明語句,都會(huì)被提升到代碼的頭部播演,這就叫做變量提升
- 函數(shù)的聲明前置:如果使用函數(shù)聲明來定義一個(gè)函數(shù)冀瓦,那么函數(shù)聲明會(huì)被提升到代碼最前面運(yùn)行
arguments 是什么
- 函數(shù)中傳入?yún)?shù)的數(shù)組,默認(rèn)就有
- **
- 修改補(bǔ)充:
-
arguments并不是數(shù)組写烤,而是類數(shù)組對(duì)象
函數(shù)的重載怎樣實(shí)現(xiàn)
- JS中不支持定義參數(shù)不同的同名函數(shù)翼闽,但是JS中函數(shù)調(diào)用沒必要把所有參數(shù)都傳入,傳的參數(shù)永遠(yuǎn)被當(dāng)做前幾個(gè)
- **
- 修改補(bǔ)充:
-
JS中同名函數(shù)會(huì)被覆蓋洲炊,JS重載示例如下:
立即執(zhí)行函數(shù)表達(dá)式是什么感局?有什么作用
(function(){
})();
作用:先創(chuàng)建一個(gè)匿名函數(shù),然后調(diào)用它暂衡,一般不定義函數(shù)名询微,除非需要遞歸調(diào)用
什么是函數(shù)的作用域鏈
在JavaScript中,變量的作用域有全局作用域和局部作用域兩種狂巢。
在JavaScript中撑毛,函數(shù)也是對(duì)象,實(shí)際上唧领,JavaScript里一切都是對(duì)象藻雌。函數(shù)對(duì)象和其它對(duì)象一樣,擁有可以通過代碼訪問的屬性和一系列僅供JavaScript引擎訪問的內(nèi)部屬性斩个。其中一個(gè)內(nèi)部屬性是[[Scope]]胯杭,該內(nèi)部屬性包含了函數(shù)被創(chuàng)建的作用域中對(duì)象的集合,這個(gè)集合被稱為函數(shù)的作用域鏈受啥,它決定了哪些數(shù)據(jù)能被函數(shù)訪問歉摧。
- **
- 示例:
-
a為全局變量,可以被fn1和fn2訪問,b為fn1的局部變量叁温,可以被fn1和內(nèi)部的fn2訪問再悼,c為fn2的局部變量,只能被fn2訪問
代碼題
- 以下代碼輸出什么
function getInfo(name, age, sex){
console.log('name:',name);
console.log('age:', age);
console.log('sex:', sex);
console.log(arguments);
arguments[0] = 'valley';
console.log('name', name);
}
getInfo('hunger', 28, '男');
getInfo('hunger', 28);
getInfo('男');
輸出
name: hunger
age: 28
sex: 男
["hunger", 28, "男"]
name valley
name: hunger
age: 28
sex: undefined
["hunger", 28]
name valley
name: 男
age: undefined
sex: undefined
["男"]
name valley
- 寫一個(gè)函數(shù)膝但,返回參數(shù)的平方和冲九?如
function sumOfSquares(){
}
sumOfSquares(2,3,4); // 29
sumOfSquares(1,3); // 10
函數(shù):
function sumOfSquares(){
var sum=0;
for(var i=0;i<arguments.length;i++){
sum+=arguments[i]*arguments[i];
}
console.log(sum);
}
- 如下代碼的輸出?為什么
console.log(a);
var a = 1;
console.log(b);
輸出:
undefined和報(bào)錯(cuò):var a跟束;被提升莺奸,但是賦值在console.log后,而 b 未定義冀宴。
- 如下代碼的輸出灭贷?為什么
sayName('world');
sayAge(10);
function sayName(name){
console.log('hello ', name);
}
var sayAge = function(age){
console.log(age);
};
輸出:
hello world 和報(bào)錯(cuò):使用函數(shù)聲明定義的函數(shù)被提升,而使用函數(shù)表達(dá)式定義的函數(shù)只提升定義聲明var = sayAge略贮;
- 如下代碼的輸出甚疟?為什么
function fn(){}
var fn = 3;
console.log(fn);
輸出:
3:var fn;在函數(shù)聲明之前逃延,但是fn = 3览妖;在函數(shù)聲明之后
- 如下代碼的輸出?為什么
function fn(fn2){
console.log(fn2);
var fn2 = 3;
console.log(fn2);
console.log(fn);
function fn2(){
console.log('fnnn2');
}
}
fn(10);
輸出:
function fn2(){
console.log('fnnn2');
}
3
function fn(fn2){
console.log(fn2);
var fn2 = 3;
console.log(fn2);
console.log(fn);
function fn2(){
console.log('fnnn2');
}
}
原因:函數(shù)內(nèi)部執(zhí)行順序是
var fn2;
console.log(fn2);
fn2 = 3;
console.log(fn2);
console.log(fn);
- 如下代碼的輸出揽祥?為什么
var fn = 1;
function fn(fn){
console.log(fn);
}
console.log(fn(fn));
結(jié)果:
報(bào)錯(cuò):fn = 1讽膏;覆蓋函數(shù)聲明
- 如下代碼的輸出?為什么
console.log(j);
console.log(i);
for(var i=0; i<10; i++){
var j = 100;
}
console.log(i);
console.log(j);
輸出:
undefined
undefined
10
100
原因:for語句是流程控制語句拄丰,不是函數(shù)府树,不會(huì)產(chǎn)生新的作用域,其內(nèi)定義的變量是會(huì)發(fā)生變量提升的
- 如下代碼的輸出料按?為什么
fn();
var i = 10;
var fn = 20;
console.log(i);
function fn(){
console.log(i);
var i = 99;
fn2();
console.log(i);
function fn2(){
i = 100;
}
}
輸出
undefined
100
10
原因:先執(zhí)行函數(shù) fn()奄侠;其內(nèi)第一次log時(shí),i 未賦值站绪,第二次log時(shí)之前執(zhí)行了 fn2();i 被賦值為100丽柿;然后第三次log時(shí)恢准,i 被賦值為10;
- 如下代碼的輸出甫题?為什么
var say = 0;
(function say(n){
console.log(n);
if(n<3)
return;
say(n-1);
}( 10 ));
console.log(say);
輸出
10
9
8
7
6
5
4
3
2
0
原因:立即執(zhí)行函數(shù)內(nèi)部發(fā)生遞歸馁筐,從10開始,直到n = 2時(shí)坠非,return敏沉;n = 2是函數(shù)內(nèi)最后一個(gè)打印的,然后跳出函數(shù)體,執(zhí)行console.log(say); say = 0盟迟;
本教程版權(quán)歸饑人谷和作者所有秋泳,轉(zhuǎn)載須說明來源。