1. 函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別
函數(shù)聲明:function functionName(){}
函數(shù)表達(dá)式:var fn = function(){}
函數(shù)聲明會提前框产,函數(shù)表達(dá)式可以省略標(biāo)識符(函數(shù)名)扯饶。
2. 什么是變量的聲明前置更啄?什么是函數(shù)的聲明前置
變量的聲明前置并不會對變量進(jìn)行賦值
console.log(a);
var a = 3;
等價于
var a;
console.log(a);//輸出結(jié)果為undefined
var a = 3;
函數(shù)的聲明前置
fn(1)
function fn(a){
console.log(a);
}
輸出的結(jié)果為1;因?yàn)閒unction fn(a){...}的整個函數(shù)已經(jīng)提前到了fn(1)之前聲明了。
3. arguments 是什么
arguments是一個類數(shù)組對象赤拒。代表傳給一個function的參數(shù)列表巩割。
??arguments對象是函數(shù)內(nèi)部的本地變量种冬;arguments 已經(jīng)不再是函數(shù)的屬性了〈志可以在函數(shù)內(nèi)部通過使用 arguments 對象來獲取函數(shù)的所有參數(shù)尔破。這個對象為傳遞給函數(shù)的每個參數(shù)建立一個條目,條目的索引號從0開始浇衬。它包括了函所要調(diào)用的參數(shù)懒构。object對象。類數(shù)組耘擂。
4. 函數(shù)的"重載"怎樣實(shí)現(xiàn)
在JS中胆剧,沒有重載。同名函數(shù)會覆蓋醉冤。但是js可以通過在函數(shù)內(nèi)部對傳入?yún)?shù)進(jìn)行判斷來達(dá)到重載的目的秩霍。
function fn(name,age,sex) {
0
if (name) {
console.log(name);
}
if (age) {
console.log(age);
}
if (sex){
console.log(sex);
}
}
fn('luoqian');
fn('luoqian',21);
fn('luoqian',21,'female');
5. 立即執(zhí)行函數(shù)表達(dá)式是什么?有什么作用
立即執(zhí)行函數(shù)表達(dá)式是什么蚁阳?有什么作用
(function(){
var a = 1;
})()
作用: 隔離作用域铃绒。
立即執(zhí)行函數(shù)能夠立即執(zhí)行,這樣可以做到隔離作用域螺捐,避免變量污染全局颠悬。
6. 求n!矮燎,用遞歸來實(shí)現(xiàn)
function fn(n){
if(n === 1 || n===0){
return 1}
else{
return n*fn(n -1);
}
}
fn(10);
7. 以下代碼輸出什么?
function getInfo(name, age, sex){
console.log('name:',name);//輸出name: 對應(yīng)參數(shù)
console.log('age:', age);//輸出age: 對應(yīng)參數(shù)
console.log('sex:', sex);//輸出sex: 對應(yīng)參數(shù)
console.log(arguments);//獲取所有輸入的參數(shù)椿疗,按照數(shù)組方式輸出
arguments[0] = 'valley';//改變第一個參數(shù)
console.log('name', name);//輸出改變后 name:對應(yīng)參數(shù)
}
getInfo('饑人谷', 2, '男');//調(diào)用函數(shù)
getInfo('小谷', 3);
getInfo('男');
函數(shù)按照自上而下順序執(zhí)行漏峰,如果沒有傳遞對應(yīng)參數(shù),則直接輸出undefined
輸出結(jié)果為
name:饑人谷 age: 2 sex: 男 [ 饑人谷, 2 ,男] name:valley
name:小谷 age: 3 sex: undefined [ 小姑, 3] name:valley
name:男 age: undefined sex: undefined [ 男] name:valley
8. 寫一個函數(shù)届榄,返回參數(shù)的平方和浅乔?
function sumOfSquares(){
var sum=0;
for(var i=0;i<arguments.length;i++){
sum+=arguments[i]*arguments[i];
}
console.log(sum);
}
var result = sumOfSquares(2,3,4)
var result2 = sumOfSquares(1,3)
console.log(result) //29
console.log(result) //10
9. 如下代碼的輸出?為什么
console.log(a);//undefined a 只是提前聲明但沒有被賦值
var a = 1;
console.log(b);//b is not defined b沒有被聲明
10. 如下代碼的輸出铝条?為什么
sayName('world');
sayAge(10);
function sayName(name){
console.log('hello ', name);
}
var sayAge = function(age){
console.log(age);
};
結(jié)果為:
hello world
sayAge is not a function 因?yàn)楹瘮?shù)表達(dá)式不會前置靖苇。
11. 如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼
var x = 10
bar()
function foo() {
console.log(x)
}
function bar(){
var x = 30
foo()
}
/*
1.
globalContext = {
AO:{
x:10
foo:function
bar:function
},
Scope:null
}
foo.[[scope]] = globalContext.AO
bar.[[scope]] = globalContext.AO
2.調(diào)用bar()
barContext = {
AO:{
x:30
},
Scope:bar.[[scope]] = globalContext.AO
}
x變成30
3.調(diào)用foo()
fooContext = {
AO:{},
Scope:foo.[[scope]] = globalContext.AO
}
輸出10
12. 如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼
var x = 10;
bar()
function bar(){
var x = 30;
function foo(){
console.log(x)
}
foo();
}
/*
1.
globalContext = {
AO:{
x:10
bar:function
},
Scope:null
}
bar.[[scope]] = globalContext.AO
2.調(diào)用bar()
barContext = {
AO:{
x:30
},
Scope:bar.[[scope]] // globalContext.AO
}
foo.[[scope]] = barContext.AO
3.調(diào)用foo()
fooContext = {
AO:{},
scope:foo.[[scope]]
}
輸出結(jié)果為30
*/
13.以下代碼輸出什么? 寫出作用域鏈的查找過程偽代碼
var x = 10;
bar()
function bar(){
var x = 30;
(function (){
console.log(x)
})()
}
*/
/*1.
globalContext = {
AO:{
x:10
bar:function
},
Scope:null
}
bar.[[scope]] = globalContext.AO
2.調(diào)用bar()
barContext = {
AO:{
x:30
function
},
Scope:bar.[[scope]] //globalContext.AO
}
function.[[scope]] = barContext.AO
3.調(diào)用立即執(zhí)行函數(shù)
functionContext = {
AO:{},
Scope:function.[[scope]]//barContext.AO
}
結(jié)果為30*/
14.以下代碼輸出什么? 寫出作用域鏈查找過程偽代碼
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.
globalContext = {
AO:{
a:1
fn:function
fn3:function
},
Scope:null
}
fn.[[scope]] = globalContext.AO
fn3.[[scope]] = globalContext.AO
2.調(diào)用fn()
fnContext = {
AO:{
a:undefined
fn2:function
},
Scope:fn.[[scope]] // globalContext.AO
}
fn2.[[scope]] = fnContext.AO
3.
fn3Context = {
AO:{
a:200
},
Scope:fn3Context.[[scope]]//globalContext.AO
}
fn2ConText = {
AO:{
a:20
},
Scope:fn2ConText.[[scope]]//fnContext.AO
}
開始執(zhí)行
console.log(a)//undefined 打印
var a = 5//fnContext中a變成5
console.log(a)//5
a++//fnContext.AO中a變?yōu)?
調(diào)用fn3()
fn3()中
console.log(a)//globalContext.AO中的a值為1班缰,打印
a = 200//globalContext.AO中的a變?yōu)?00
調(diào)用fn2()
console.log(a);//fnContext.AO中的a值為6贤壁,打印
a = 20;//fnContext.AO中的a變?yōu)?0
繼續(xù)執(zhí)行fn()
console.log(a)//fnContext.AO中的a值為20,打印
fn()結(jié)束
console.log(a)//globalContext.AO中a值為200埠忘,打印
//輸出的結(jié)果 undefined 5 1 6 20 200
*/