一。不帶圓括號(hào)的函數(shù)名訪問(wèn)的是函數(shù)指針,而非調(diào)用函數(shù)
//不帶圓括號(hào)的函數(shù)名訪問(wèn)的是函數(shù)指針,而非調(diào)用函數(shù)
function sum(num1,num2){
return num1+num2;
}
console.log(sum(10,10));//20
console.log(sum);? //function sum(num1, num2)
console.log(sum()); //NaN
var anotherSum=sum;
console.log(anotherSum(10,10));//20
sum=null;? ? //使得sum()函數(shù)的指針為空
console.log(anotherSum(10,10));//20
console.log(sum(10,10));//uncaught TypeError: sum is not a function
二。雖然函數(shù)名可以理解為指針,但是ECMAScript 沒(méi)有函數(shù)重載的概念
如何申明了同名的函數(shù),則按順序,后面的函數(shù)覆蓋掉前面的函數(shù)
三。函數(shù)申明與函數(shù)表達(dá)式的區(qū)別---函數(shù)申明會(huì)被解釋器預(yù)先讀?。╢unction declaration hoisting)
alert(sum(10,10));//20;因?yàn)轭A(yù)先讀取到了sum()函數(shù)的申明
alert(sum1(10,10))//報(bào)錯(cuò),因?yàn)檎也坏絪um1()函數(shù);
function sum(num1,num2){
return num1+num2;
}
var sum1=function(num1,num2){
return num1+num2;
}
四。var sum=function( ){...} 和 ?sum=function( ){....}的區(qū)別?
和變量的定義是相似的,缺少 var 關(guān)鍵字,定義的就是全局變量。?
但是這兩種寫法都是函數(shù)的表達(dá)式寫法。
五。在函數(shù)內(nèi)部有兩個(gè)特殊的對(duì)象:arguments 和 this?
arguments 是一個(gè)數(shù)組,主要作用是保存函數(shù)參數(shù)-----所以javascript函數(shù)不在乎傳進(jìn)來(lái)什么類型的參數(shù),也不在乎傳進(jìn)來(lái)幾個(gè)參數(shù).
作用一:可以直接利用數(shù)組訪問(wèn)參數(shù) ,如arguments[0];
作用二:在遞歸函數(shù)中的應(yīng)用--------arguments.callee();
這里重點(diǎn)說(shuō)明一下arguments.callee();它相當(dāng)于FunctionaName( )
function factorial(num){
if (num<=1){
return 1;
}else{
return num*arguments.callee(num-1);
}
}
不用 return?num*factorial( num-1);的目的就是擔(dān)心函數(shù)名在發(fā)生變化,程序會(huì)出錯(cuò) ?這叫消除緊密耦合現(xiàn)象
六。函數(shù)的兩個(gè)屬性和方法?
?每個(gè)函數(shù)都包含length 和prototype 屬性
length用法: ?FunctionName.length ?可以得到函數(shù)當(dāng)前傳入的參數(shù)個(gè)數(shù)
prototype用法:函數(shù)的原型屬性,很多函數(shù)的方法依托于這個(gè)屬性,也是實(shí)現(xiàn)函數(shù)繼承的重要因素
每個(gè)函數(shù)都包含非繼承來(lái)的兩個(gè)方法:apply( )和call( );
主要的意義在于:(1)傳遞函數(shù)參數(shù)(2)擴(kuò)充函數(shù)的作用域
舉個(gè)栗子:
//apply()和call()擴(kuò)充函數(shù)作用域,功能:在特定的作用域中調(diào)用函數(shù)
window.color="red";
var object={ color:"blue"}
function sayColor(){
alert(this.color);
}
sayColor();//red--函數(shù)內(nèi)部作用域中沒(méi)有color屬性,便利用函數(shù)作用域鏈向上查找找到全局window.color="red"
sayColor.call(this);//red--調(diào)用函數(shù)內(nèi)部作用于,找color,沒(méi)找到便向上查找找到全局window.color="red"
sayColor.call(object);//blue--函數(shù)體內(nèi)部this指針指向object,所以找到 color:"blue"
sayColor.call(window);//red--同理找到全局作用域window.color="red"
七。涉及到的專業(yè)術(shù)語(yǔ):
function declaration hoisting (函數(shù)申明提升) 避免函數(shù)的緊密耦合