Javascript中函數的四種調用方式


一、Javascript中函數的幾個基本知識點:

1.函數的名字只是一個指向函數的指針,所以即使在不同的執行環境,即不同對象調用這個函數,這個函數指向的仍然是同一個函數。

 

2.函數中有兩個特殊的內部屬性:arguments和this.

 arguments主要是用來保存函數參數,arguments中的callee屬性主要是用來指向擁有當前arguments的函數(理解Javascript參數中的arguments對象).

 

3.在ECMAScript5中規范了另一個函數屬性:caller(Opera早期版本不支持,其他版本瀏覽器都支持),它的作用是保存調用當前函數的函數的引用.

實例:

function outer() {
	inner();
}
function inner() {
	console.log(inner.caller);
}
outer();

測試結果:

為了實現更松散的耦合,在inner()方法中同樣可以利用arguments.callee.caller來訪問,得到的結果和上面的結果一樣.

 

4.在ECMAScript5中還定義了arguments.caller,它主要是用來區別函數中的caller屬性。在非嚴格模式下,arguments.caller得到的值都是undefined;在嚴格模式下,下面的三種情況都會報錯:

"use strict"
function outer() {
	inner();
}
function inner() {
	//console.log(inner.caller);//報錯
	//console.log(arguments.caller);//報錯
	//console.log(arguments.callee.caller);//報錯
}
outer();

  

5.函數是個對象,因此它有屬性和方法:每個函數都包括兩個屬性:length、prototype.通過函數名直接調用length,可以得到函數形參的個數;prototype是原型屬性,每個函數都會有一個原型屬性,更多關於原型屬性的內容:理解javascript中的原型模式. 每個函數都包含兩個非繼承來的方法:apply()和call()(apply()和call()的區別).

                                                 

二、四種調用函數的方式:函數調用模式、方法調用模式、構造器模式、apply\call模式.

1.直接調用函數的方式,this指向的全局對象window.

實例1:

函數聲明

function add(a,b) {
	return a+b;
}

console.log(add(1,2));

 

實例2:

函數表達式

var add=function (a,b) {
	return a+b;
}

console.log(add(1,2));

 

2.函數作為對象的方法調用,this指向當前的對象.

  實例1:

var o = {
	prop: 21,
	f:function() {
		return this.prop;
	}
};

console.log(o.f());

 實例2:

var o = {
	prop: 21,
};

function f() {
		return this.prop;
}

o.f = f;
console.log(o.f());//21

 

3.通過new調用構造器的方式,this指向當前構造函數的原型.

實例1:

返回this對象給o

function MyClass() {
	this.a = 21;
}

var o = new MyClass();
console.log(o.a);//21

 

實例2:

如果有return,則返回return的結果,如果沒有就會返回this。

function MyClass() {
	this.a = 21;
	return {a:22};
}

var o = new MyClass();
console.log(o.a);//22

 

4.通過apply或call的方式,這兩個的第一參數即this,當第一個參數為null,this指向window;當第一個參數為一個對象,this就指向當前這個對象。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM