1.函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別洛心?
函數(shù)聲明:
function functionName(){
statement;
}
使用function關(guān)鍵字聲明一個函數(shù)
函數(shù)表達(dá)式:
var printName = function(){
console.log('Byron');
};
聲明一個變量賦值其為函數(shù)
2.什么是變量的聲明前置饿这?什么是函數(shù)的聲明前置
變量的聲明前置:先解析代碼眠寿,獲取所有被聲明的變量,然后再一行一行地運行。這造成的結(jié)果酱吝,就是所有的變量的聲明語句纳本,都會被提升到代碼的頭部
函數(shù)的聲明前置:和變量的聲明會前置一樣窍蓝,函數(shù)聲明同樣會前置,如果我們使用函數(shù)表達(dá)式那么規(guī)則和變量一樣饮醇,如果我們使用函數(shù)聲明的方式它抱,那么即使函數(shù)寫在最后也可以在前面語句調(diào)用。
3.arguments 是什么
arguments
可以獲取到該函數(shù)的所有傳入?yún)?shù)
function printPersonInfo(name, age, sex){
console.log(name);
console.log(age);
console.log(sex);
console.log(arguments);
}
4.函數(shù)的重載怎樣實現(xiàn)
在JavaScript中沒有函數(shù)重載的概念朴艰,函數(shù)通過名字確定唯一性观蓄,參數(shù)不同也被認(rèn)為是相同的函數(shù),后面的覆蓋前面的
5.立即執(zhí)行函數(shù)表達(dá)式是什么祠墅?有什么作用
//方法1
( function() {
}() );
//方法2
( function() {
} )();
作用:創(chuàng)建一個獨立的作用域侮穿,外面訪問不到變量,避免污染
6毁嗦、什么是函數(shù)的作用域鏈
任何程序設(shè)計語言都有作用域的概念亲茅,簡單的說,作用域就是變量與函數(shù)的可訪問范圍狗准,即作用域控制著變量與函數(shù)的可見性和生命周期克锣。在JavaScript中,變量的作用域有全局作用域和局部作用域兩種腔长。
1.全局作用域
在代碼中任何地方都能訪問到的對象擁有全局作用域
2.局部作用域
和全局作用域相反袭祟,局部作用域一般只在固定的代碼片段內(nèi)可訪問到,最常見的例如函數(shù)內(nèi)部捞附,所有在一些地方也會看到有人把這種作用域稱為函數(shù)作用域
作用域鏈
當(dāng)代碼在一個環(huán)境中執(zhí)行時巾乳,會創(chuàng)建變量對象的一個作用域鏈(scope chain,不簡稱sc)來保證對執(zhí)行環(huán)境有權(quán)訪問的變量和函數(shù)的有序訪問您没。作用域第一個對象始終是當(dāng)前執(zhí)行代碼所在環(huán)境的變量對象,如果當(dāng)前環(huán)境沒有胆绊,就依次訪問上一級變量氨鹏。
代碼
1.以下代碼輸出什么?
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('hunger', 28, '男');
getInfo('hunger', 28);
getInfo('男');
name:hunger;
age:28;
sex:男压状;
['hunger',28,'男']
name:valley;
name:hunger;
age:28;
sex:undefined;
['hunger',28]
name:valley;
name:男;
age:undefined;
sex:undefined;
['男']
name:valley;
2.寫一個函數(shù)仆抵,返回參數(shù)的平方和?如
function sumOfSquares(){
var sum=0;
for(var i=0;i<arguments.length;i++){
sum +=arguments[i]*arguments[i];
}
console.log(sum);
}
sumOfSquares(2,3,4); // 29
sumOfSquares(1,3); // 10
3.如下代碼的輸出种冬?為什么 ?
console.log(a); //undefined;
var a = 1;
console.log(b);//報錯
聲明(var)會被前置肢础,所以a是undefined,而b未被聲明碌廓,所以報錯身坐。
4..如下代碼的輸出鹅颊?為什么
sayName('world');
sayAge(10);
function sayName(name){
console.log('hello ', name);
}
var sayAge = function(age){
console.log(age);
};
hello world;
未定義
因為聲明和定義函數(shù)會前置峭范,可轉(zhuǎn)換為
var sayAge
function sayName(name){
console.log('hello ', name);
}
sayName('world');
sayAge(10);
sayAge = function(age){
console.log(age);
};
5.如下代碼的輸出径玖?為什么
function fn(){
}
var fn = 3;
console.log(fn);//3
可轉(zhuǎn)化為
var fn
function fn(){}
fn = 3;
console.log(fn);/
6.如下代碼的輸出?為什么
function fn(fn2){
console.log(fn2);
var fn2 = 3;
console.log(fn2);
console.log(fn);
function fn2(){
console.log('fnnn2');
}
}
fn(10);
function fn2(){
console.log('fnnn2');
}
3
function fn(fn2){
console.log(fn2);
var fn2 = 3;
console.log(fn2);
console.log(fn);
function fn2(){
console.log('fnnn2');
}
}
可轉(zhuǎn)化為
function fn(fn2){
var fn2//聲明提前
function fn2(){
console.log('fnnn2');
}//函數(shù)定義提前
console.log(fn2); //打印fn2這一函數(shù)
fn2 = 3;
console.log(fn2); //3
console.log(fn);//打印fn函數(shù)
}
fn(10);
7.如下代碼的輸出纪挎?為什么
var fn = 1;
function fn(fn){
console.log(fn);
}
console.log(fn(fn)); //報錯
等同于
var fn;
function fn(fn){
console.log(fn);
}
fn = 1//fn變成了1
console.log(fn(fn));//fn 不是函數(shù)期贫,報錯
8.如下代碼的輸出?為什么
//作用域
console.log(j);
console.log(i);
for(var i=0; i<10; i++){
var j = 100;
}
console.log(i);
console.log(j);
undefined;
undefined;//i和j都未定義
10;//for循環(huán)的聲明都是全局變量
100;
9.如下代碼的輸出异袄?為什么
fn();
var i = 10;
var fn = 20;
console.log(i);
function fn(){
console.log(i);
var i = 99;
fn2();
console.log(i);
function fn2(){
i = 100;
}
}
undefined;
100;
10;
等同于
var i;
var fn;
function fn(){
var i;//聲明前置
function fn2(){
i = 100;
}//函數(shù)定義前置
console.log(i); //i未定義
i = 99;
fn2();//i變成100
console.log(i);//100
}
fn(); //執(zhí)行函數(shù)
i = 10;//i變成10
fn = 20;
console.log(i);10
10.如下代碼的輸出通砍?為什么
var say = 0;
(function say(n){
console.log(n);
if(n<3)
return;
say(n-1);
}( 10 ));
console.log(say);
10
9
8
7
6
5
4
3
2
0
代碼等同于
var say;
(function say(n){
console.log(n);
if(n<3)
return;
say(n-1);
}( 10 ));//函數(shù)立即執(zhí)行,n初始值為10烤蜕,循環(huán)直到n等于2停止
say = 0;
console.log(say);//0