問(wèn)答
函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別?
函數(shù)聲明用指定的參數(shù)聲明一個(gè)函數(shù),必須有函數(shù)名稱,可在函數(shù)聲明之前使用函數(shù) 函數(shù)表達(dá)式可省略函數(shù)名稱創(chuàng)建匿名函數(shù)什么是變量的聲明前置?什么是函數(shù)的聲明前置?
javascript的變量聲明具有hoisting機(jī)制,JavaScript引擎在執(zhí)行的時(shí)候,會(huì)把所有變量的聲明都提升到當(dāng)前作用域的最前面,但是并未進(jìn)行下面的判斷,所以未賦值。 函數(shù)的聲明前置是指將整個(gè)被定義的函數(shù)提升,此時(shí)這個(gè)函數(shù)是有意義的,可以被調(diào)用的。arguments是什么?
arguments對(duì)象不能顯式創(chuàng)建,arguments對(duì)象只有函數(shù)開(kāi)始時(shí)才可用。獲得該函數(shù)所有傳入?yún)?shù)。函數(shù)的重載怎樣實(shí)現(xiàn)?
重載是很多面向?qū)ο笳Z(yǔ)言實(shí)現(xiàn)多態(tài)的手段之一,在靜態(tài)語(yǔ)言中確定一個(gè)函數(shù)的手段是靠方法簽名----函數(shù)名+參數(shù)列表,也就是說(shuō)相同名字的函數(shù)參數(shù)個(gè)數(shù)不同或者順序不同都被認(rèn)為是不同的函數(shù),稱為函數(shù)重載 在JavaScript中,函數(shù)調(diào)用沒(méi)必要把所有參數(shù)都傳入,只要你函數(shù)體內(nèi)做好處理就行,但前提是傳的參數(shù)永遠(yuǎn)被當(dāng)做前幾個(gè)立即執(zhí)行函數(shù)表達(dá)式是什么?有什么作用?
立即執(zhí)行函數(shù)常用寫(xiě)法
(function(){ /* code */ }())
(function(){ /* code */ })()
作用
隔離作用域
省下執(zhí)行語(yǔ)句
省略函數(shù)名臣以冥函數(shù)執(zhí)行
什么是函數(shù)的作用域鏈? 在大多數(shù)語(yǔ)言中都是用花括號(hào){}來(lái)形成一個(gè)作用域,俗稱塊作用域,avaScript的作用域是靠函數(shù)來(lái)形成的,也就是說(shuō)一個(gè)函數(shù)內(nèi)定義的變量函數(shù)外不可以訪問(wè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('hunger', 28, '男');
/*name:huanger
age:28
sex:男
arguments[3]
name valley */
getInfo('hunger', 28);
/* name:huanger
age:28
sex:undefined
arguments[2]
name valley */
getInfo('男');
/* name:huanger
age:undefined
sex:undefined
arguments[1]
name valley */
- 寫(xiě)一個(gè)函數(shù),返回參數(shù)的平方和?
function sumOfSquares() {}
sumOfSquares(2, 3, 4); // 29
sumOfSquares(1, 3); // 10
function sumOfSquares() {
var sumOfSquares = 0;
for (var i = 0; i < arguments.length; i++) {
sumOfSquares = sumOfSquares + arguments[i] * arguments[i];
}
return sumOfSquares
}
console.log(sumOfSquares(2, 3, 4));
console.log(sumOfSquares(1, 3));
- 如下代碼的輸出?為什么
console.log(a);
// undefined 聲明前置,但是沒(méi)有賦值;
var a = 1;
console.log(b);
// b is not defined 沒(méi)有聲明;
- 如下代碼的輸出?為什么
sayName('world');
sayAge(10);
function sayName(name) {
console.log('hello ', name); // hello world,
}
var sayAge = function(age) {
console.log(age); // sayAge is not a function,
};
/* 函數(shù)sayName提前,執(zhí)行sayName('world'),
執(zhí)行sayAge(10), 因?yàn)関ar sayAge = function(age) {console.log(age);}
為函數(shù)表達(dá)式,作為一個(gè)變量, 因此sayAge函數(shù)未聲明。*/
- 如下代碼的輸出?為什么
function fn() {}
var fn = 3;
console.log(fn); //3
// console.log(fn)打印fn,var fn=3;對(duì)fn進(jìn)行聲明且賦值為3
- 如下代碼的輸出?為什么
function fn(fn2) {
console.log(fn2);
var fn2 = 3;
console.log(fn2);
console.log(fn);
function fn2() {
console.log('fnnn2');
}
}
fn(10);
轉(zhuǎn)換為
function fn(fn2) {
var fn2;
function fn2() {
console.log('fnnn2');
}
console.log(fn2); // 打印函數(shù)fn2
var fn2 = 3;
console.log(fn2); // 3
console.log(fn); // 打印函數(shù)fn
}
- 如下代碼的輸出?為什么
var fn = 1;
function fn(fn) {
console.log(fn);
}
console.log(fn(fn)); // fn is not a function
聲明前置轉(zhuǎn)換為
var fn;
function fn(fn) {
console.log(fn);
}
fn = 1;
console.log(fn(fn)); //故fn不是函數(shù),報(bào)錯(cuò)
- 如下代碼的輸出?為什么
console.log(j); //underfined,未定義
console.log(i); //underfined,未定義
for (var i = 0; i < 10; i++) {
var j = 100;
}
console.log(i); // 10
console.log(j); // 100
/* 因?yàn)閒or循環(huán)中var i=0,var j=100定義且賦值了i,j,
且在執(zhí)行這個(gè)賦值語(yǔ)句的時(shí)候,會(huì)沿著作用域鏈尋找名字叫做i,j的變量,
一直找到作用域鏈的頂端還沒(méi)有找到,于是給window添加一個(gè)屬性i,j然后賦值。 */
- 如下代碼的輸出?為什么
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;
}
}
// 聲明前置后
var i;
var fn;
function fn() {
var i;
function fn2() {
i = 100;
}
console.log(i); //underfined,未賦值
i = 99;
fn2();
console.log(i); //100, 執(zhí)行function fn2(){ i = 100; }后
}
fn();
var i = 10;
var fn = 20;
console.log(i); //10, var i=10賦值
- 如下代碼的輸出?為什么
var say = 0;
(function say(n) {
console.log(n);
if (n < 3) return;
say(n - 1);
}(10));
console.log(say);
轉(zhuǎn)換后
var say;
function say(n) {
console.log(n);
if (n < 3) return;
say(n - 1);
}(10);
(function say(n) {
console.log(n);
if (n < 3) return;
say(n - 1);
}(10));
var say = 0;
console.log(say);
// 10 9 8 7 6 5 4 3 2 0
/* 函數(shù)function say() {}
立即執(zhí)行當(dāng)n < 3 停止并返回?cái)?shù)據(jù), 根據(jù)函數(shù)打印10 9 8 7 6 5 4 3 2
var say = 0 賦值, 打印say, 0。*/
本教程版權(quán)歸本人和饑人谷所有