1.函數(shù)聲明和函數(shù)表達式有什么區(qū)別
- 函數(shù)聲明不必放在調(diào)用前面
- 函數(shù)表達式必須放在調(diào)用前面
2.什么是變量的聲明前置啊掏?什么是函數(shù)的聲明前置
- 變量聲明前置:JavaScript引擎的工作方式是肉迫,先解析代碼荤崇,獲取所有被聲明的變量,然后再一行一行地運行柱锹。這造成的結(jié)果宏侍,就是所有的變量的聲明語句,都會被提升到代碼的頭部管搪。
console.log(a);
var a = 1;
即:
var a;
console.log(a);
a = 1;
- 函數(shù)聲明前置:JavaScript引擎將函數(shù)名視同變量名虾攻,所以采用function命令聲明函數(shù)時,整個函數(shù)會像變量聲明一樣更鲁,被提升到代碼頭部霎箍。所以,下面的代碼不會報錯澡为。
f();
function f() {}
3.arguments 是什么
- arguments對象包含了函數(shù)運行時的所有參數(shù)漂坏,arguments[0]就是第一個參數(shù),arguments[1]就是第二個參數(shù)媒至,以此類推顶别。這個對象只有在函數(shù)體內(nèi)部,才可以使用拒啰。
var f = function(one) {
console.log(arguments[0]);
console.log(arguments[1]);
console.log(arguments[2]);
}
f(1, 2, 3)
// 1
// 2
// 3
4.函數(shù)的"重載"怎樣實現(xiàn)
- 重載是很多面向?qū)ο笳Z言實現(xiàn)多態(tài)的手段之一驯绎,在靜態(tài)語言中確定一個函數(shù)的手段是靠方法簽名——函數(shù)名+參數(shù)列表,也就是說相同名字的函數(shù)參數(shù)個數(shù)不同或者順序不同都被認為是不同的函數(shù)谋旦,稱為函數(shù)重載剩失。
- 在JavaScript中沒有函數(shù)重載的概念,函數(shù)通過名字確定唯一性册着,參數(shù)不同也被認為是相同的函數(shù)拴孤,后面的覆蓋前面的,但可以在函數(shù)體針對不同的參數(shù)調(diào)用執(zhí)行相應(yīng)的邏輯甲捏。
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ù)表達式是什么演熟?有什么作用
- 立即執(zhí)行函數(shù)表達式(Immediately-Invoked Function Expression),簡稱IIFE司顿。表示定義函數(shù)之后芒粹,立即調(diào)用該函數(shù)。
(function(){
var a = 1;
})()
其他寫法:
(function fn1() {});
[function fn2() {}];
1, function fn3() {};
6.求n!免猾,用遞歸來實現(xiàn)
function fn(n){
if(n===1){
return 1;
}
return n*fn(n-1);//遞歸調(diào)用后還未結(jié)束:再乘以n是辕,所以它不是尾調(diào)用
}
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, '男');
getInfo('小谷', 3);
getInfo('男');
- 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 result = sumOfSquares(2,3,4)
var result2 = sumOfSquares(1,3)
console.log(result) //29
console.log(result) //10
9.如下代碼的輸出旁蔼?為什么
console.log(a);
var a = 1;
console.log(b);
- 輸出:undefined 報錯("error" "ReferenceError: b is not defined ...")锨苏;
- 因為var聲明的變量會聲明前置,即在console.log(a)之前就聲明了a(但還沒賦值)棺聊,故輸出undefined;
- b沒有聲明伞租,所以會報錯
10.如下代碼的輸出?為什么
sayName('world');
sayAge(10);
function sayName(name){
console.log('hello ', name);
}
var sayAge = function(age){
console.log(age);
};
- 輸出:hello world 函數(shù)聲明前置
- 輸出:報錯("error" "TypeError: sayAge is not a function") 函數(shù)表達式不前置
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
function: function
}
scope: globalContext.AO
}
function.[[scope]] = barContext.AO
functionContext = {
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:{
a: undefined -> 5 -> 6 -> 20
fn2: function
}
scope: globalContext.AO
}
fn2.[[scope]] = fnContext.AO
fn3Context = {
AO:{}
scope: globalContext.AO
}
fn2Context = {
AO:{}
scope: fnContext.AO
}