語(yǔ)法
function 函數(shù)名([形參列表]){
執(zhí)行代碼
}
函數(shù)名([實(shí)參列表])
函數(shù)定義
函數(shù)聲明
var x=add(2,3);
function add(number1,number2){
var sum=number1+number2;
return sum;
}函數(shù)表達(dá)式
將匿名函數(shù)賦值給變量
var add= function(number1,number2){
var sum=number1+number2;
return sum;
}
var x=add(2,3);
var y=add(2);//實(shí)參數(shù)量小于形參
var y=add(2,3,4);//實(shí)參數(shù)量多于形參對(duì)象實(shí)例化(構(gòu)造函數(shù))
var add=new Function("i","j",return(i+j));
區(qū)別
函數(shù)聲明的方式定義函數(shù)可以在聲明前調(diào)用,而函數(shù)表達(dá)式和實(shí)例化必須在定義函數(shù)后調(diào)用
實(shí)例化的函數(shù)定義方法無(wú)法識(shí)別父函數(shù)的變量
(function(){
var i=10;
var add = new Function("j","console.log(i+j);debugger;")
add(1);})()
2.利用argument進(jìn)行函數(shù)計(jì)算
function add(){
var sum =0,parameter;
for(i=0;i<=arguments.length; i++){
parameter = arguments[i];
sum = sum + parameter;
}
return sum;
}
3.參數(shù)為原始類(lèi)型,值傳遞
function increment(number){
number = number +1;
return number;
}
var a=1;
var x=increment(a);2
a;//1,只傳遞值,原始值不改變
- 參數(shù)為對(duì)象類(lèi)型,引用傳遞
function increment(person){
person.age=person.age+1;
return person;
}
var jerry={name:"jerry",age:9};
var x=increment(jerry);
x;
jerry;//{name:"jerry",age:10}原始值被改變
作用域
-
變量起作用的范圍
若內(nèi)部沒(méi)有相應(yīng)的作用對(duì)象,則會(huì)作用到外部

-
作為對(duì)象屬性
var point{
x:1,
y:1,
move:function(stepX,stepY){
this.x+=stepX;this即指函數(shù)作用的對(duì)象
this.y+=stepY;
}point.move(2,1);
構(gòu)造函數(shù)
構(gòu)造函數(shù)
function Point(x,y){
this.x=x;
this.y=y;
this.move=function(stepX,stepY){
this.x+=stepX;
this.y+=stepY;
}
var point1=new Point(1,1);//{x:1,y:1,move:function(stepX,stepY){}}
var point2=new Point(1,2);原型 設(shè)置共用的方法函數(shù)
function Point(x,y){
this.x=x;
this.y=y;
}
Point.prototype.move=function(stepX,stepY){
this.x+=stepX;
this.y+=stepY;
}
var point=new point(1,1);
point.move(2,1);//x:3,y:2
function Car(type,color){
this.type=type;
this.color=color;
this.status="stop";
this.light="off";
}
//在原型函數(shù)的基礎(chǔ)上創(chuàng)建新的方法
Car.prototype.start=function(){
this.status="start";
this.light="on";
console.log(this.type+"is"+this.status);
}
Car.prototype.stop=function(){
this.status="stop";
this.light="off";
}
var audi=new Car("audi","sliver");
var benzi=new Car("benzi","black");
audi.start;//調(diào)用方法
benzi.stop;
audi.status;//訪問(wèn)屬性
audi.light="off";
- 構(gòu)造函數(shù)與普通函數(shù)的區(qū)別
1.本質(zhì)上沒(méi)有區(qū)別
2.構(gòu)造函數(shù)通常會(huì)有this指定實(shí)例屬性,原型對(duì)象上通常有一些公共方法
3.構(gòu)造函數(shù)命名通常首字母大寫(xiě)
函數(shù)調(diào)用(this)
調(diào)用模式
構(gòu)造函數(shù)調(diào)用模式
方法調(diào)用模式
audi.start函數(shù)調(diào)用模式
函數(shù)調(diào)用沒(méi)有指明特定對(duì)象時(shí)function(),this指向全局變量即window
內(nèi)部方法的子函數(shù)無(wú)法調(diào)用到this
var myNumber ={
value:1,
double: function(){
var that = this;
var helper = function(){
that.value=add(that.value,that.value);
}
helper();
}-
apply(call)調(diào)用模式
借用其他函數(shù)的方法Function.prototype.apply()
function Point(x,y){
this.x= x;
this.y= y;
}
Point.prototype.move=function(x,y){
this.x+=x;
this.y+=y;
}
var p = new Point(0,0);
p.move(2,2);
var circle={x=1,y=1,r=1};
Point.prototype.apply(circle,[2,1]);//x=3,y=2,z=1// Function.prototype.bind() var circlemove=Point.prototype.bind(circle,2,1);//綁定函數(shù)不直接執(zhí)行 setTimeout(circlemove,1000);//延遲執(zhí)行函數(shù)
函數(shù)調(diào)用參數(shù)
- Array-like
arguments[index]
arguments[length] - arguments.callee
遞歸
function factorial(i){
if(i==0){
return 1;}//遞歸函數(shù)的退出條件
return i*factorial(i-1);//調(diào)用函數(shù)本身
}
閉包
-
屬性隱藏,對(duì)象封裝
在函數(shù)內(nèi)部含有子函數(shù),子函數(shù)調(diào)用了父函數(shù)的變量
-
記憶函數(shù)(不懂)
var factorial=(function(){
var count=0;
var fac= function(i){
count++;
if(i==0){
console.log("調(diào)用次數(shù)"+count);
return 1;}//遞歸函數(shù)的退出條件
return i*factorial(i-1);//調(diào)用函數(shù)本身
}
return fac
})()for (var i=0;i<=10;i++){ console.log(factorial(i));//調(diào)用函數(shù) }
First-class function
- 函數(shù)柯里化curry
將接受多個(gè)參數(shù)的函數(shù)轉(zhuǎn)為接受單一參數(shù)的函數(shù),返回的的函數(shù)可以接受后續(xù)參數(shù) - 回調(diào)

