函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別而芥?
函數(shù)聲明,跟變量聲明一樣會(huì)前置屹蚊。
function 函數(shù)名稱(){
statement;
}
函數(shù)表達(dá)式,只是一個(gè)賦值表達(dá)式坝辫,會(huì)把變量聲明前置。
var 變量名稱 = function(){
statement;
};
什么是變量的聲明前置射亏?什么是函數(shù)的聲明前置?
聲明前置近忙,就是在一個(gè)作用域塊中,所有的變量都被放在塊的開始出聲明智润。如果有變量聲明和函數(shù)聲明及舍,那么按著他們的先后順序來聲明前置。
arguments 是什么 窟绷?
arguments在JS中是函數(shù)的一個(gè)內(nèi)置對(duì)象锯玛,可以用調(diào)用數(shù)據(jù)的方法來調(diào)用arguments。比如length,還有index方法兼蜈。但是數(shù)組的push和pop對(duì)象是不適用的攘残。可以通過使用argument對(duì)象讓函數(shù)能夠調(diào)用** 數(shù)量不定的參數(shù) **为狸。
函數(shù)的重載怎樣實(shí)現(xiàn)?
嚴(yán)格意義上說歼郭, javascript不支持函數(shù)重載,不能夠定義同樣的函數(shù)然后通過編譯器去根據(jù)不同的參數(shù)執(zhí)行不同的函數(shù)辐棒。因?yàn)镴S只要函數(shù)名稱相同病曾,那么后一個(gè)函數(shù)會(huì)覆蓋前一個(gè)函數(shù)。不過我們可以通過JS自身屬性模擬函數(shù)重載的過程漾根。
arguments是JavaScript里的一個(gè)內(nèi)置對(duì)象泰涂,包含了調(diào)用者傳遞的** 實(shí)際參數(shù) **。arguments具有l(wèi)ength屬性辐怕,是一個(gè)“偽數(shù)組”逼蒙,它存儲(chǔ)的實(shí)際參數(shù)能夠用數(shù)組訪問符[]來訪問,并且是只讀不可寫寄疏。
參數(shù)不同個(gè)數(shù)和參數(shù)不同類型的重載
立即執(zhí)行函數(shù)表達(dá)式是什么其做?有什么作用?
(函數(shù)定義表達(dá)式)函數(shù)調(diào)用表達(dá)式
(function(){ console.log("test");})();
或者
(function(){ console.log("test");}());
作用:創(chuàng)建并執(zhí)行一個(gè)匿名函數(shù)。
立即執(zhí)行函數(shù)原理及使用場(chǎng)景
什么是函數(shù)的作用域鏈赁还?
作用域就是變量與函數(shù)的可訪問范圍妖泄。即作用域控制著變量與函數(shù)的可見性和生命周期。在JavaScript中艘策,變量的作用域有全局作用域和局部作用域兩種蹈胡。
函數(shù)對(duì)象有一個(gè)內(nèi)部屬性[Scope],包含了函數(shù)被創(chuàng)建后的作用域中對(duì)象的集合,這個(gè)集合被稱為函數(shù)的作用域鏈罚渐,它決定了哪些數(shù)據(jù)能被函數(shù)訪問却汉。
如何應(yīng)用作用域鏈:在函數(shù)里面使用頻率較高的外部變量,最好先將外部變量保存為局部變量后荷并,再進(jìn)行操作合砂,這樣就大大減少通過作用域鏈查找變量的時(shí)間。
代碼題
1.以下代碼輸出什么源织?
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, '男');
//name:hunger age:28 sex:男["hunger",28,"男"] name valley
getInfo('hunger', 28);
//name:hunger age:28 sex:undefined ["hunger",28] name valley
//name:男 age:undefined sex:undefined ["男"] name valley
2翩伪、寫一個(gè)函數(shù),返回參數(shù)的平方和谈息?如
function sumOfSquares(){
var sum = 0;
for(i=0;i<arguments.length;i++){
sum = sum +arguments[i]*arguments[i];
}
console.log(sum);
}
sumOfSquares(2,3,4); // 29
sumOfSquares(1,3); // 10
3缘屹、如下代碼的輸出?為什么?
console.log(a);
var a = 1;
console.log(b);
聲明前置后
var a;
console.log(a);//undefined
a = 1;
console.log(b);//報(bào)錯(cuò)侠仇,不存在
原因:變量聲明提前
4轻姿、如下代碼的輸出?為什么逻炊?
sayName('world');
sayAge(10);
function sayName(name){
console.log('hello ', name);
}
var sayAge = function(age){
console.log(age);
};
聲明前置后
function sayName(name){
console.log('hello ', name);
}
var sayAge;
sayName('world'); //'hello'world
sayAge = function(age){
console.log(age);
}; //只是給變量sayAge賦值互亮,沒有輸出
原因:sayAge只聲明未執(zhí)行
5、如下代碼的輸出余素?為什么胳挎?
function fn(){}
var fn = 3;
console.log(fn);
變量前置后
var fn; //聲明fn變量
function fn(){}; // 聲明函數(shù)fn
fn = 3; // 覆蓋函數(shù)fn,fn為變量,賦值為3
console.log(fn); //3
其實(shí)若是
var fn = 3;
function fn(){}
console.log(fn); //3
原因:當(dāng)函數(shù)執(zhí)行有命名沖突的時(shí)候溺森,函數(shù)執(zhí)行時(shí)載入順序是** 變量慕爬、函數(shù)、參數(shù) **屏积。
6医窿、如下代碼的輸出?為什么炊林?
function fn(fn2){
console.log(fn2);
var fn2 = 3;
console.log(fn2);
console.log(fn);
function fn2(){
console.log('fnnn2');
}
}
fn(10);
函數(shù)內(nèi)部變量前置
function fn(fn2){
var fn2 = 10; //傳參數(shù)姥卢,給fn2賦值10
function fn2(){
console.log('fnnn2');
} //覆蓋變量fn2,fn2為函數(shù)
console.log(fn2); //function fn2(){ console.log('fnnn2'); }
fn2 = 3;
console.log(fn2); //3
console.log(fn); //輸出fn整個(gè)函數(shù)
}
fn(10);
7渣聚、如下代碼的輸出独榴?為什么 ?
var fn = 1;
function fn(fn){ console.log(fn); }
console.log(fn(fn));
輸出報(bào)錯(cuò)奕枝,第一行fn為變量棺榔,并賦值。第二行只是聲明了個(gè)函數(shù)隘道,并未執(zhí)行症歇,沒有輸出郎笆。運(yùn)行第三行時(shí),fn是一個(gè)變量忘晤,并非函數(shù)宛蚓,所以報(bào)錯(cuò)。
8设塔、如下代碼的輸出凄吏?為什么 ?
//作用域
console.log(j);
console.log(i);
for(var i=0; i<10; i++){
var j = 100;
}
console.log(i);
console.log(j);
聲明提前后為
var i ;
var j; //if語句是流程控制語句闰蛔,不是函數(shù)痕钢,所以i、j在此為全局變量钞护,聲明前置盖喷。
console.log(j); //undefined
console.log(i)爆办;//undefined
for(i = 0;i<10;i++){
var j = 100 ;
}
console.log(i); //10
console.log(j); //100
9难咕、如下代碼的輸出?為什么距辆?
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;
}
}
聲明前置后為
var i;
var fn;
function fn(){
var i;
function fn2(){
i = 100;
}
console.log(i);
i = 99;
fn2();
console.log(i);
}
fn(); //undefined 100
i = 10;
fn = 20;
console.log(i); //10
10余佃、如下代碼的輸出?為什么?
var say = 0;
(function say(n){
console.log(n); //10
if(n<3) return;
say(n-1); //9 8 7 6 5 4 3
}( 10 ));
console.log(say); //0
原因:立即執(zhí)行函數(shù)內(nèi)跨算,say的作用域和外層變量say的不一樣爆土,所以最后一行執(zhí)行輸出為10。
立即執(zhí)行函數(shù)內(nèi)诸蚕,先傳入?yún)?shù)10步势,運(yùn)行到第三行輸出10。
當(dāng)n>=3時(shí)背犯,傳入?yún)?shù)9/8/7/6/5/4/3后坏瘩,執(zhí)行函數(shù)say輸出9 8 7 6 5 4 3。
當(dāng)n<3漠魏,跳出循環(huán)倔矾。
** 本教程版權(quán)歸博主和饑人谷所有,轉(zhuǎn)載須說明來源柱锹。**