函數聲明和函數表達式有什么區(qū)別
函數聲明
使用function關鍵字可以聲明一個函數
//函數聲明
function sayHello(){
console.log('hello')
}
//函數調用
sayHello()
函數表達式
var sayHello = function(){
console.log('hello');
}
sayHello()
區(qū)別
函數聲明:聲明不必放到調用的前面
函數表達式:聲明必須放到調用的前面
什么是變量的聲明前置?什么是函數的聲明前置
- 變量提升:JavaScript引擎的工作方式是硫麻,先解析代碼插爹,獲取所有被聲明的變量舒岸,然后在一步一步的運行锄码,這就造成所有變量的聲明都會被提到頭部。
- JavaScript引擎將函數名視同變量名罢浇,所以采用function命令聲明函數時讼积,整個函數會像變量聲明一樣,被提升到相關作用域的前部烦衣。
- 變量聲明前置:在全局作用域中造成的歹河。
- 函數聲明前置:在局部作用域中造成的。
arguments 是什么
arguments 是JavaScript里的一個內置對象,有的函數都有屬于自己的一個arguments對象花吟,它包括了函所要調用的參數秸歧。object對象。
function t(){
alert(arguments[0]);//顯示t函數的輸入參數衅澈,這里是2
}
t('2');//調用函數键菱,傳入參數2
在函數內部,你可以使用arguments對象獲取到該函數的所有傳入參數
function printPersonInfo(name, age, sex){
console.log(name);
console.log(age);
console.log(sex);
console.log(arguments);
}
函數的"重載"怎樣實現
在一些其他語言中,重載函數常用來實現功能類似而所處理的數據類型不同的問題今布。
但是在Js中经备,是沒有重載的,因為同名函數會覆蓋部默。但可以在函數體針對不同的參數調用執(zhí)行相應的邏輯
例如:
function printPeopleInfo(name, age, sex){
if(name){
console.log(name);
}
if(age){
console.log(age);
}
if(sex){
console.log(sex);
}
}
printPeopleInfo('Byron', 26);
printPeopleInfo('Byron', 26, 'male');
立即執(zhí)行函數表達式是什么侵蒙?有什么作用
先用一個圓括號把函數括起來, 再在后面加一對圓括號。
(function(){
var a = 1;
})()
console.log(a); //undefined
作用:立即執(zhí)行被圓括號括起來的這個函數, 并能隔離作用域
求n!傅蹂,用遞歸來實現
function factor(n){
if(n < 0) {
var point = console.log( "負數沒有階乘")
return point;
} else if ( n === 0 || n=== 1 ) {
return 1;
}
else{
return n * factor(n-1)
}
}
factor(5) //120
以下代碼輸出什么蘑志?
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('饑人谷', 2, '男');
//name:饑人谷
//age:2
//sex:男
//arguments(3)
//name valley
getInfo('小谷', 3);
//name:小谷
//age:3
//sex:undefined
//arguments(2)
//name valley
getInfo('男');
//name:男
//age:undefined
//sex:undefined
//arguments(1)
//name valley
寫一個函數,返回參數的平方和贬派?
function sumOfSquares(){
}
var result = sumOfSquares(2,3,4)
var result2 = sumOfSquares(1,3)
console.log(result) //29
console.log(result2) //10
返回平方和
function sumOfSquares(){
var sum = 0;
var i = 1;
for( var i = 0 ; i < arguments.length; i++){
sum =sum+arguments[i]*arguments[i];
}
return sum;
}
var result = sumOfSquares(2,3,4)
var result2 = sumOfSquares(1,3)
console.log(result) //29
console.log(result2) //10
如下代碼的輸出急但?為什么
console.log(a);
var a = 1;
console.log(b);
輸出步驟
var a //聲明前置
console.log(a); //undefined,因為變量提升的原因搞乏,只是提升變量波桩,未賦值
var a = 1;
console.log(b); // 報錯,b is not defined请敦。
// 代碼中沒有聲明變量b也沒有對其賦值
如下代碼的輸出镐躲?為什么
sayName('world');
sayAge(10);
function sayName(name){
console.log('hello ', name);
} //hello world
var sayAge = function(age){
console.log(age);
// 因為這是函數表達式,所以聲明必須放到調用的前面
// 報錯 輸出 sayAge is not a function
};
如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼
var x = 10
bar()
function foo() {
console.log(x)
}
function bar(){
var x = 30
foo()
}
// 調用bar()
// 調用foo()
// 在foo里面查找x,未找到侍筛,往上一層查找
// x = 10
// 輸出10
以下代碼輸出什么? 寫出作用域鏈的查找過程偽代碼
var x = 10;
bar()
function bar(){
var x = 30;
(function (){
console.log(x)
})()
}
// var x = 10
// 調用 bar()
// var x = 30 ;
// (function ()){
// console.log(x)
// })() 查找x值
// 找到 x = 30
// console.log(30)
// 30
以下代碼輸出什么萤皂? 寫出作用域鏈查找過程偽代碼
var a = 1;
function fn(){
console.log(a)
var a = 5
console.log(a)
a++
var a
fn3()
fn2()
console.log(a)
function fn2(){
console.log(a)
a = 20
}
}
function fn3(){
console.log(a)
a = 200
}
fn()
console.log(a)
//1 倒數第二行 調用 fn()
//2 var a //聲明前置
//3 console.log(a) //輸出undefined
//4 var a = 5
//5 console.log(a) // 輸出5
//6 a++
//7 var a // fn(){}內 a=6
//8 fn3() // 受全局變量影響
//9 調用 fn3() //fn3 不在fn函數 內,自己內部也沒定義a
//10 所以往上查找匣椰,忽略 fn3() 內值裆熙,找到全局 var a = 1;
//11 console.log(a) // 輸出 1
//12 a = 200 // 此時,fn3()內 a的值為200
//13 fn2() // 受fn(){}變量影響
//14 調用fn2(){} // 因為fn2(){} 在fn(){}內
//15 console.log(a) // 輸出 6 (查看注釋第7行)
//16 a = 20 // fn(){} a = 20(已被修改)
//17 console.log(a) // 受fn(){}變量影響
// 輸出 20 (注釋16行)
//18 console.log(a) // 受全局變量影響(注釋12行)
//19 // 輸出200