函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別
函數(shù)聲明的形式 function fn(){ } 調(diào)用 fn() ;
函數(shù)表達(dá)式的形式 var XX = function fn(){ } 調(diào)用 XX();
區(qū)別: 形式不同外页藻,調(diào)用方式不同外
函數(shù)聲明提前蛹磺,函數(shù)聲明的位置無論在哪里,調(diào)用方法都可以使用语婴,因為函數(shù)已經(jīng)提前定義了
函數(shù)表達(dá)式則要先定義函數(shù)表達(dá)式,再調(diào)用
// 函數(shù)表達(dá)式
// 1 前后兩個函數(shù)的名字可以相同也可以不相同
// 2 function 后面的這個名字是可以省略的
// 3 function 后面的這個名字只能再函數(shù)內(nèi)部使用
// 4 函數(shù)調(diào)用只有在函數(shù)表達(dá)式聲明后調(diào)用闸衫。
// 函數(shù)聲明
// function fn() {}
// fn();
//1 函數(shù)聲明必須有函數(shù)名
//2 可以在任意地方調(diào)用fn();
什么是變量的聲明前置峻堰?什么是函數(shù)的聲明前置
什么是變量的聲明前置?
什么是函數(shù)的聲明前置?
如果我們使用函數(shù)聲明的方式两疚,那么即使函數(shù)寫在最后也可以在前面語句調(diào)用.
arguments 是什么
arguments 是個類數(shù)組床估,能使用arguments[i]和arguments.length
arguments 里面是函數(shù)的具體參數(shù),保存的是實際傳入的參數(shù)诱渤,而不局限于函數(shù)聲明所定義的參數(shù)列表
https://baike.baidu.com/item/arguments/4291417?fr=aladdin
函數(shù)的"重載"怎樣實現(xiàn)
其它面向?qū)ο笳Z言如Java的一個常見特性是:能夠根據(jù)傳入的不同數(shù)量量或類型的參數(shù)丐巫,通過“重載”函數(shù)來發(fā)揮不同的功用。但是這個特性在Javascript中并沒有被直接支持勺美,可是有很多辦法實現(xiàn)這一功能递胧。
不管何種面向?qū)ο笳Z,函數(shù)重載必須依賴兩件事情赡茸,分別是:
1)判斷傳入?yún)?shù)數(shù)量的能力
2)判斷傳入?yún)?shù)類型的能力
函數(shù)的argument是包含傳入?yún)?shù)的類數(shù)組缎脾,它有數(shù)組的兩個特性,一是可以使用數(shù)組的length方法坛掠,二是可以通過argument[index]獲得具體的參數(shù)值
所以可以通過argument 來實現(xiàn)
舉例:
function send( message, who ) {
if( arguments.length >= 2 ) {
console.log("你對" + who + "說:" + message);
} else {
console.log("你對大家說:" + message);}}
這個例子是判斷傳入?yún)?shù)的數(shù)值來實現(xiàn)重載
例2
function send( message ) {
if( typeof message === 'undefined' ) {
console.log("ERROR:錯誤的信息內(nèi)容");
} else { console.log("你說:" + message); }}
這個例子是判斷參數(shù)傳入的類型來實現(xiàn)重載
立即執(zhí)行函數(shù)表達(dá)式是什么赊锚?有什么作用
立即執(zhí)行函數(shù)表達(dá)式有多種寫法:(function(){})();, 或(function(){}()); ,或!function(){}();,或void function(){}();
作用:創(chuàng)建一個獨立的作用域治筒。這個作用域里面的變量屉栓,外面訪問不到(即避免變量污染)舷蒲。
求n!,用遞歸來實現(xiàn)
function count(n){
if(n < 0){
return "wrong";
}else if(n ===0 || n === 1){
return 1;
}else{
return n*count(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('饑人谷', 2, '男');
getInfo('小谷', 3);
getInfo('男');
name: 饑人谷
age: 2
sex: 男
["饑人谷"牲平,2,"男']
name valley
name: 小谷
age: 3
sex: undefined
["小谷"域滥,3]
name valley
name: 男
age: undefined
sex: undefined
["男"]
name valley
undefined
寫一個函數(shù)纵柿,返回參數(shù)的平方和?
function sumOfSquares(){
var result = 0;
for(var i=0;i<arguments.length;i++){
result += arguments[i]*arguments[i];
}
return result;
}
var result = sumOfSquares(2,3,4)
var result2 = sumOfSquares(1,3)
console.log(result) //29
console.log(result2) //10
如下代碼的輸出启绰?為什么
console.log(a);
var a = 1;
console.log(b);
首先會輸出 undefined
其次 Uncaught ReferenceError: b is not defined
因為 變量聲明前置昂儒,變量提前聲明,聲明的值為undefined
b 沒有定義,所以會報錯
如下代碼的輸出委可?為什么
sayName('world');
sayAge(10);
function sayName(name){
console.log('hello ', name);
}
var sayAge = function(age){
console.log(age);
};
輸出結(jié)果為
hello world
Uncaught TypeError: sayAge is not a function
原因 函數(shù)聲明前置渊跋,函數(shù)表達(dá)式不會,函數(shù)表達(dá)式要先聲明再用着倾,所以sayName('world')可以執(zhí)行
如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼
var x = 10
bar()
function foo() {
console.log(x)
}
function bar(){
var x = 30
foo()
}
10
如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼
var x = 10;
bar()
function bar(){
var x = 30;
function foo(){
console.log(x)
}
foo();
}
30
以下代碼輸出什么? 寫出作用域鏈的查找過程偽代碼
var x = 10;
bar()
function bar(){
var x = 30;
(function (){
console.log(x)
})()
}
以下代碼輸出什么拾酝? 寫出作用域鏈查找過程偽代碼
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