1.函數聲明和函數表達式有什么區別?Javascript 中函數聲明和函數表達式是存在區別的,函數聲明在JS解析時進行函數提升,因此在同一個作用域內,不管函數聲明在哪里定義,該函數都可以進行調用。而函數表達式的值是在JS運行時確定,并且在表達式賦值完成后,該函數才能調用。這個微小的區別,可能會導致JS代碼出現意想不到的bug,讓你陷入莫名的陷阱中。
2.什么是變量的聲明前置?什么是函數的聲明前置?
在一個作用域下,var 聲明的變量和function 聲明的函數會前置;函數和 var 一個變量聲明前置的大概意思是先有,再用;
var a = 3;console.log(a); //3
sayHello();
function sayHello(){
console.log('hello');
}
3.arguments 是什么?
在函數內部,你可以使用arguments對象獲取到該函數的所有傳入參數,通過arguments[1、2、3]等...可以獲取到相應的傳入參數.
4.函數的"重載"怎樣實現?
js沒有重載! 重載是函數具有相同的名字,但是由于傳入的參數不同,執行不同操作。在js中沒有類似其他語言的重載,因為同名函數會被覆蓋。但是js可以通過在函數內部對傳入參數進行判斷來達到重載的目的;
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');
5.立即執行函數表達式是什么?有什么作用?
聲明一個匿名函數,馬上調用這個匿名函數;作用:創建一個獨立的作用域。
求n!,用遞歸來實現
function sum(n){
if(n === 1) {
return 1
}
return n + sum(n-1)
}
sum(n)
以下代碼輸出什么?
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:男;['饑人谷',2,男];name valley;
getInfo('小谷', 3);
//輸出:name:小姑;age:3;sex:undefined;['小谷',3];name valley;
getInfo('男');
//輸出:name:男;age:undefined;sex:undefined;['男'];name valley;
寫一個函數,返回參數的平方和?
var result=0;
for (var i=0;i<arguments.length;i++) {
result = result + arguments[i]*arguments[i];
}
return result;
}
var demo = sumOfSquares(1,3);
console.log(demo);
如下代碼的輸出?為什么
console.log(a);//undefined;因為此函數作用于里面有一個聲明a,但是在此沒有賦值,所以是undefined;
var a = 1;
console.log(b)//報錯;因為b沒有聲明;
如下代碼的輸出?為什么
sayName('world');
sayAge(10);
function sayName(name){
console.log('hello ', name);//hello world;調用函數的聲明sayname('world')=name,所以是hello world;
}
var sayAge = function(age){
console.log(age);//報錯,因為沒有聲明;
};```
如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼
bar()
function foo() {
console.log(x)
}
function bar(){
var x = 30
foo()
}
//輸出為10;var聲明-->執行bar--->調用foo函數-->執行-->foo函數-->在foo函數里面尋找變量a.沒有找到在上下文里面尋找-->a=10;
如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼
var x = 10;
bar()
function bar(){
var x = 30;
function foo(){
console.log(x)
}
foo();
}
//輸出30;var聲明-->執行bar--->調用foo函數-->執行foo函數-->在foo函數里面尋找變量a.沒有找到在上下文里面尋找-->a=30;```
以下代碼輸出什么? 寫出作用域鏈的查找過程偽代碼
function bar(){
var x = 30;
(function (){
console.log(x)
})()
}
//輸出30;var聲明-->執行bar--->立即執行函數function-->函數里面尋找變量a.沒有找到在上下文里面尋找-->a=30;
以下代碼輸出什么? 寫出作用域鏈查找過程偽代碼
function fn(){
console.log(a)//undefined
var a = 5
console.log(a)//5
a++
var a
fn3()//1
fn2()//6
console.log(a)//20
function fn2(){
console.log(a)//
a = 20
}
}
function fn3(){
console.log(a)//
a = 200
}
fn()
console.log(a)//200
//輸出:5,1,6,20,200;聲明a-->執行函數fn()-->輸出a為undefined(未定義)-->聲明a=5所以輸出5-->a自增1-->聲明a=6-->調用函數ffn3-->執行fn3()-->輸出結果為1-->聲明全局變量a=200-->fn3=1-->執行fn2()-->未在fn2()里面找到a變量,在fn()中尋找a=6,聲明fn()中的a=20-->執行輸出a=20-->執行全局變量a=200,輸出200