JavaScript 整理筆記(四)
阿新 • • 發佈:2019-01-06
1.3 函式
1.3.1 函式物件
Javascript 中的函式也是物件。函式物件連線到Function.prototype,該原型物件本身
連線到 Object.prototype。
每個函式物件在建立時會有一個prototype屬性。它的值是一個擁有 constructor 屬性
且值為該函式的物件。
例:
function a(){};
a.prototype.constructor; // function a(){}
函式的不同之處在於它可以被呼叫。
例:
a(); // 呼叫函式a
1.3.2 函式字面量
函式物件通過函式字面量來建立: var reduce = function(a, b){ return a - b; }
1.3.3 呼叫
4種呼叫模式: 方法呼叫模式 當一個函式被儲存為物件的一個屬性時,則稱其為物件的一個方法。當被呼叫是this被繫結到該物件。 var obj = { sum: 0, add: function(num){ this.sum += num || 1; } } obj.add(); obj.sum; // 1 obj.add(2); obj.sum; // 3 通過this可取的該物件的上下文的方法稱為公共方法。 函式呼叫模式 當一個函式不是一個物件的屬性時,那麼該函式被當做一個函式來呼叫: function add(a, b){ return a + b; } var sum = add(1, 2); sum; // 3 此模式呼叫函式時,this會被繫結到全域性物件。這是語言設計上的錯誤。 我們一般通過定義一個變數來給它賦值this。一般是 that 或 _this。 obj.add2 = function(){ var that = this; var a = function(){ that.sum = add(that.sum, that.sum); } a(); // 6 var b = function(){ this.sum = add(this.sum, this.sum); } b(); // undefined 該函式中sum為undefined } obj.add2(); 構造器呼叫模式 建構函式約定是以大寫格式命名函式名的函式,通過new來呼叫,但是不加上new,也不會警告, 這個很蛋疼。 在上述面前加new來呼叫時,會預設建立一個連線到該函式的prototype成員的新物件,同時this 也會繫結到這個新物件上。 var Fn = function(value){ this.value = value; }; Fn.prototype.getValue = function(){ return this.value; } var fn = new Fn(1001); fn.getValue(); // 1001 apply呼叫模式 apply方法會構建一個引數陣列傳遞給呼叫函式。也允許選擇this的值。 var arr = [1, 2]; var sum = add.apply(this, arr); sum; // 3 var sum2 = add.apply(null, arr); sum2; // 3 var o = { value: 2002 }; var value = Fn.prototype.getValue.apply(o); value; // 2002 // apply 會把 this 指向 o , 所以會返回 this.value 即 o.value; 每個函式除了宣告定義的形式引數,還接收附加的兩個引數: this - 值取決於呼叫的模式 arguments - 函式的實際引數個數,類似陣列,但不是陣列 呼叫函式時函式引數個數不匹配是不會導致執行錯誤,多的引數會被忽略,少的引數會預設是undefined。 例: function add3(a, b, c) { console.log("" + a + b + c); } add3(1, 2, 3, 4); // 123 add3(1, 2); // 12undefined
——–內容繫個人整理,如有錯誤,歡迎指出。謝謝!——–