一、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就指向當前這個對象。