1. 程式人生 > >Js函式的三種建立、四種呼叫

Js函式的三種建立、四種呼叫

// 函式的三種建立方法
function one(){   // 函式宣告,不屬於任何物件,始終預設為全域性物件
console.log("第一個函式")
//預設有一個return this,返回函式中的內容
}
one();      //必須呼叫;可以在函式宣告前呼叫(預處理變異機制)                       

var fn=function(){                  //函式表示式
console.log("第二個函式")
}
fn(); //必須先宣告再呼叫                                 

var fun=new Function(console.log("第三個函式"
)
)
;
//建構函式 無需呼叫,會自調
// 函式的4種呼叫方式
function one(){                     
console.log("一個函式")
}
one();  //作為一個函式去呼叫


var person={
name:"tom",
age:18,
speak:function(){
console.log("English")
}
}                   
person.speak(); //函式作為物件的方法的呼叫


function num(n1,n2){
this.number1=n1;
this.number2=n2;// 建構函式中的this沒有任何值
} var i=new num(3,5); console.log(i.number1) // 建構函式會建立一個新的物件,新的物件會繼承建構函式的屬性和方法 function myFunction(a,b){ return a+b; } myFunction.call(this,2,5); var myArry=[2,5]; myFunction.apply(this,myArry); //作為函式方法呼叫函式 call()和apply()是預定義的函式方法,apply傳入的是一個數組,call傳入的是引數

js的執行機制問題:(宣告提升)
1、在js中js引擎會優先解析var變數和function定義!在預解析完成後從上到下逐步進行!
2、解析var變數時,會把值儲存在“執行環境”中,而不會去賦值,值是儲存作用!例如:
alert(a); var a = 2; 這時會輸出undifiend,意思是沒有被初始化沒有被賦值!
這並不是沒有被定義,錯誤了的意思!
3、在解析function時會把函式整體定義,這也就解釋了為什麼在function定義函式時為什麼可以先呼叫後聲明瞭!其實表面上看是先呼叫了,其實在內部機制中第一步實行的是把以function方式定義的函式先聲明瞭(預處理)