JavaScript 函數(shù)調(diào)用
函數(shù)體代碼在函數(shù)被調(diào)用時才會執(zhí)行。
Javascript函數(shù)有4中調(diào)用方式:
普通的函數(shù)調(diào)用
方法調(diào)用
構(gòu)造函數(shù)調(diào)用
通過 call() 和 apply() 間接調(diào)用
1.普通的函數(shù)調(diào)用
最常用的函數(shù)調(diào)用方式,如:
alert("hello");
var result = add(1, 2);
2. 方法調(diào)用
//定義一個函數(shù)
function hello(name) {
alert('hello,' + name);
};
var user = {};
//賦值給user的sayHi屬性
user.sayHi = hello;
//方法調(diào)用
user.sayHi('張三');
普通的函數(shù)調(diào)用和方法調(diào)用的一個區(qū)別:在"普通的函數(shù)調(diào)用"方式中,函數(shù)的調(diào)用上下文(this的值),為全局對象(非嚴(yán)格模式)或者undefined(嚴(yán)格模式)。而在"方法調(diào)用"方式中,this指向當(dāng)前對象。利用這一特性,我們可以在方法不需要明確的返回值時,直接返回this,從而實(shí)現(xiàn)"方法鏈"。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文網(wǎng)(php.cn)</title> </head> <body> <p id="demo"></p> <script> function myFunction(a, b) { return a * b; } document.getElementById("demo").innerHTML = myFunction(10, 2); </script> </body> </html>
嵌套函數(shù)中的this:嵌套函數(shù)中,內(nèi)層函數(shù)不會繼承外層函數(shù)的this,即當(dāng)內(nèi)層函數(shù)作為方法調(diào)用時,內(nèi)層函數(shù)的this指向當(dāng)前調(diào)用對象;當(dāng)內(nèi)層函數(shù)作為函數(shù)調(diào)用時,this的值為全局對象(非嚴(yán)格模式)或者undefined(嚴(yán)格模式)。怎樣在內(nèi)層函數(shù)中訪問外層函數(shù)的this呢?通常將this保存在一個局部變量中,通過變量來訪問:
var obj = {
f : function() {
var self = this;
console.log(this === obj);//true,this指向當(dāng)前對象
f1();
function f1() {
console.log(this === obj);//false,this為全局對象或者undefined
console.log(self === obj);//true,self指向外層this,即當(dāng)前對象
}
}
};
3. 構(gòu)造函數(shù)調(diào)用
當(dāng)使用new關(guān)鍵字創(chuàng)建一個對象時,即調(diào)用了構(gòu)造函數(shù)。構(gòu)造函數(shù)若沒有形參,可以省略圓括號:
var obj = new Object();
//等價于
var obj = new Object;
調(diào)用構(gòu)造函數(shù),創(chuàng)建了一個新對象,這個新對象會成為該構(gòu)造函數(shù)的調(diào)用上下文(this的值):
function User(name) {
this.name=name;
console.debug(this);
}
var user = new User('張三');
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文網(wǎng)(php.cn)</title> </head> <body> <p id="demo"></p> <script> function myFunction(arg1, arg2) { this.firstName = arg1; this.lastName = arg2; } var x = new myFunction("John","Doe") document.getElementById("demo").innerHTML = x.firstName; </script> </body> </html>
4. 通過 call() 和 apply() 間接調(diào)用
Javascript中函數(shù)也是對象,也擁有方法。其中 call() 和 apply() 可以用來間接調(diào)用函數(shù)。call() 的第一個參數(shù)用來指定調(diào)用上下文(即this的值),后面的參數(shù)是傳入調(diào)用函數(shù)的實(shí)參。
var name = 'A';
var user = {
name : 'B'
};
function showName() {
alert(this.name);
}
showName();//A,this為全局對象
showName.call(user);//B,this為user對象
apply() 和 call() 類似,區(qū)別在于,后面的實(shí)參需要以數(shù)組的形式傳遞(可將當(dāng)前函數(shù)的arguments數(shù)組直接傳入)。