語法
function 函數名([形參列表]){
執行代碼
}
函數名([實參列表])
函數定義
函數聲明
var x=add(2,3);
function add(number1,number2){
var sum=number1+number2;
return sum;
}函數表達式
將匿名函數賦值給變量
var add= function(number1,number2){
var sum=number1+number2;
return sum;
}
var x=add(2,3);
var y=add(2);//實參數量小于形參
var y=add(2,3,4);//實參數量多于形參對象實例化(構造函數)
var add=new Function("i","j",return(i+j));
區別
函數聲明的方式定義函數可以在聲明前調用,而函數表達式和實例化必須在定義函數后調用
實例化的函數定義方法無法識別父函數的變量
(function(){
var i=10;
var add = new Function("j","console.log(i+j);debugger;")
add(1);})()
2.利用argument進行函數計算
function add(){
var sum =0,parameter;
for(i=0;i<=arguments.length; i++){
parameter = arguments[i];
sum = sum + parameter;
}
return sum;
}
3.參數為原始類型,值傳遞
function increment(number){
number = number +1;
return number;
}
var a=1;
var x=increment(a);2
a;//1,只傳遞值,原始值不改變
- 參數為對象類型,引用傳遞
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}原始值被改變
作用域
-
變量起作用的范圍
若內部沒有相應的作用對象,則會作用到外部
-
作為對象屬性
var point{
x:1,
y:1,
move:function(stepX,stepY){
this.x+=stepX;this即指函數作用的對象
this.y+=stepY;
}point.move(2,1);
構造函數
構造函數
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);原型 設置共用的方法函數
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";
}
//在原型函數的基礎上創建新的方法
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;//調用方法
benzi.stop;
audi.status;//訪問屬性
audi.light="off";
- 構造函數與普通函數的區別
1.本質上沒有區別
2.構造函數通常會有this指定實例屬性,原型對象上通常有一些公共方法
3.構造函數命名通常首字母大寫
函數調用(this)
調用模式
構造函數調用模式
方法調用模式
audi.start函數調用模式
函數調用沒有指明特定對象時function(),this指向全局變量即window
內部方法的子函數無法調用到this
var myNumber ={
value:1,
double: function(){
var that = this;
var helper = function(){
that.value=add(that.value,that.value);
}
helper();
}-
apply(call)調用模式
借用其他函數的方法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);//綁定函數不直接執行 setTimeout(circlemove,1000);//延遲執行函數
函數調用參數
- Array-like
arguments[index]
arguments[length] - arguments.callee
遞歸
function factorial(i){
if(i==0){
return 1;}//遞歸函數的退出條件
return i*factorial(i-1);//調用函數本身
}
閉包
-
屬性隱藏,對象封裝
在函數內部含有子函數,子函數調用了父函數的變量
-
記憶函數(不懂)
var factorial=(function(){
var count=0;
var fac= function(i){
count++;
if(i==0){
console.log("調用次數"+count);
return 1;}//遞歸函數的退出條件
return i*factorial(i-1);//調用函數本身
}
return fac
})()for (var i=0;i<=10;i++){ console.log(factorial(i));//調用函數 }
First-class function
- 函數柯里化curry
將接受多個參數的函數轉為接受單一參數的函數,返回的的函數可以接受后續參數 - 回調