1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別
函數(shù)聲明:聲明不必放調(diào)用的前面;
函數(shù)表達(dá)式:聲明必須放調(diào)用的前面蚓耽。
2.什么是變量的聲明前置?什么是函數(shù)的聲明前置
變量的聲明前置: JavaScript引擎的工作方式是旋炒,先解析代碼步悠,獲取所有被聲明的變量,然后再一行一行地運(yùn)行瘫镇。這造成的結(jié)果鼎兽,就是所有的變量的聲明語句,都會被提升到當(dāng)前作用域的頭部铣除。如下:
console.log(a);
var a = 3;
console.log(a);
//經(jīng)聲明前置變?yōu)?var a;
console.log(a) // undefined
a = 3
console.log(a) // 3
函數(shù)的聲明前置:JavaScript引擎將函數(shù)名視同變量名谚咬,所以采用function聲明函數(shù)時,整個函數(shù)會像var聲明變量一樣尚粘,被提升到當(dāng)前作用域的頭部择卦。如下:
sayHello();
function sayHello(){
console.log('hello');
}
//經(jīng)聲明前置變?yōu)?function sayHello(){
console.log('hello');
}
sayHello(); // 'hello'
3.arguments
是什么
arguments
是一個類似數(shù)組的對象, 對應(yīng)于傳遞給函數(shù)的參數(shù)。在函數(shù)內(nèi)部,你可以使用arguments
對象獲取到該函數(shù)的所有傳入?yún)?shù)。如下:
function printPersonInfo(name, age, sex){
console.log(name);
console.log(age);
console.log(sex);
console.log(arguments);
}
4.函數(shù)的"重載"怎樣實(shí)現(xiàn)
重載是函數(shù)具有相同的名字秉继,但是由于傳入的參數(shù)不同祈噪,執(zhí)行不同操作。在js中沒有類似其他語言的重載尚辑,因?yàn)橥瘮?shù)會被覆蓋辑鲤。但是js可以通過在函數(shù)內(nèi)部對傳入?yún)?shù)進(jìn)行判斷來達(dá)到重載的目的。如下:
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.立即執(zhí)行函數(shù)表達(dá)式是什么杠茬?有什么作用
表達(dá)式:
(function(){
var a = 1;
})()
console.log(a); //undefined
作用:隔離作用域月褥。
6.求n!,用遞歸來實(shí)現(xiàn)
function factor(n) {
if (n === 1){
return 1;
}
return n = n*factor(n-1);
}
7.以下代碼輸出什么瓢喉?
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;
8.寫一個函數(shù)灯荧,返回參數(shù)的平方和礁击?
function sumOfSquares(){
var sum = 0
for(i=0;i<arguments.length;i++){
sum = sum + Math.pow(arguments[i],2);
}
return sum;
}
var result = sumOfSquares(2,3,4);
var result2 = sumOfSquares(1,3);
console.log(result); //29
console.log(result2); //10
9. 如下代碼的輸出?為什么
console.log(a); // 1
var a = 1;
console.log(b); //Uncaught ReferenceError: b is not defined,因?yàn)閎沒有聲明逗载。
10.如下代碼的輸出哆窿?為什么
sayName('world');
sayAge(10);
function sayName(name){
console.log('hello ', name);
}
var sayAge = function(age){
console.log(age);
};
輸出:
hello world;
//函數(shù)聲明 聲明可以不用放在調(diào)用的前面。
sayAge is not a function
//函數(shù)表達(dá)式 聲明必須放在調(diào)用的前面厉斟。
11如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼
var x = 10
bar()
function foo() {
console.log(x)
}
function bar(){
var x = 30
foo()
}
//輸出:10
偽代碼:
globalContext {
AO{
x:10
foo:function
bar:function
}
Scope=null
foo.[[scope]] = globalContext.AO
bar.[[scope]] = globalContext.AO
}
barContext {
AO{
x:30
}
Scope = globalContext.AO
}
fooContext {
AO{
}
Scope = globalContext.AO
}
12. 如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼
var x = 10;
bar()
function bar(){
var x = 30;
function foo(){
console.log(x)
}
foo();
}
//輸出:30
偽代碼:
globalContext{
AO{
x:10
bar:function
}
Scope = null
bar.[[scope]] = globalContext.AO
}
barContext{
AO{
x = 30
foo:function
}
Scope = globalContext.AO
foo.[[scope]] = barContext.AO
}
fooContext{
AO{
}
Scope = barContext.AO
}
13. 以下代碼輸出什么? 寫出作用域鏈的查找過程偽代碼
var x = 10;
bar()
function bar(){
var x = 30;
(function (){
console.log(x)
})()
}
//輸出:30
偽代碼:
globalContext{
AO{
x:10
bar:function
}
Scope = null
bar.[[scope]] = globalContext.AO
}
barContext{
AO{
x = 30
立即執(zhí)行函數(shù):function
}
Scope = globalContext
立即執(zhí)行函數(shù).[[scope]] = barContext.AO
}
立即執(zhí)行函數(shù)Context{
AO{
}
Scope = barContext.AO
}
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)
//輸出:undefined、5擦秽、1码荔、6、20感挥、200
偽代碼:
globalContext{
AO{
a:1 200
fn:function
fn3:function
}
Scope = null
fn.[[scope]] = globalContext.AO
fn3.[[scope]] = globalContext.AO
}
fnContext{
AO{
x = 5 6 20
fn2:function
}
Scope = globalContext.AO
fn2.[[scope]] = fnContext.AO
}
fn3Context{
AO{
}
Scope = globalContext.AO
}
fn2Context{
AO{
}
Scope = fnContext.AO
}
//undefined 5 1 6 20 200