函式1

weixin_34253539發表於2017-01-04

1.函式物件
函式就是物件。
物件是“名\值”對的集合並擁有一個連線到物件原型的隱藏的連線
函式物件連線到Function.prototype上
每個函式物件在建立時,隱藏兩個屬性,即函式的上下文和實現函式行為的程式碼
每個函式在建立時都會攜帶一個prototype屬性,它的值擁有一個constructor屬性且值為該物件的函式
2.函式字面量
函式字面量 = function關鍵字 + 函式名(這裡省略) + 引數(a, b) + body函式體

var add = function (a, b) {
    return a + b;
}
alert(add(3, 4));   // 7

3.呼叫
呼叫一個函式即暫停當前函式並把執行權交給新函式。
呼叫的函式除了接受實參外,還將接受this和arguments兩個引數
this的值取決於呼叫的模式:方法呼叫模式、函式呼叫模式、構造器模式和apply呼叫模式
arguments表示接受實參的偽陣列
方法呼叫模式
當一個函式被儲存為一個物件的屬性,我們將這個函式成為方法
當這個方法被呼叫時,this被繫結到該物件

var myObject = {
    value : 0,
    increment : function (inc) {
        alert(this);    // [object Object],即myObject物件
        this.value += typeof inc === "number" ? inc : 1;
    }
}
myObject.increment();
document.writeln(myObject.value);       // 1
myObject.increment(2);
document.writeln(myObject.value);       // 3

當一個函式被非物件呼叫時,那麼它就是方法呼叫模式
this被繫結到window物件中

window.value = 1;
myObject.one = function () {
    var helper = function () {
        alert(this.value);  // 1,這個匿名函式中的this統統指向window
        this.value = add(this.value, this.value);
    }
    helper();
}
myObject.one();
document.writeln(myObject.value);   // 3,沒有變化
document.writeln(this.value);       // 2,由add()方法已經改變

解決方法:用that將this保留下來,即把執行環境儲存下來

myObject.two = function () {
    var that = this;    // 將this代表的myObject物件儲存到that變數中
    var helper = function () {
        這是that就代表了myObject物件
        that.value = add(that.value, that.value);
    }
    helper();
}
myObject.two();
document.writeln(myObject.value);   // 6
document.writeln(this.value);       // 1

構造器呼叫模式
如果一個函式在其前面加new呼叫,那麼將建立一個連線到本函式的prototype成員的新物件
而this將會繫結到那個新物件中

var Que = function (string) {
    this.name = string;
}
Que.prototype.getName = function () {
    return this.name;
}
var q = new Que("no");
alert(q.getName());     // no

Apply呼叫模式
apply函式構建一個陣列並去其去呼叫函式
它接受兩個引數:第一個是將被繫結this的值,第二個是一個陣列

var array = [3, 4];
alert(add.apply(null, array));  // 7, this沒有被強制繫結值,即為window
var nameObject = {
    name : "zhangfei"
}
// 將this繫結到nameObject中,並且呼叫Que.prototype.getName方法
alert(Que.prototype.getName.apply(nameObject)); // zhangfei

4.引數
當函式被呼叫時,它會被免費贈送一個arguments引數,它是傳入實參的集合
這使得編寫一個無形成的函式成為可能

var addNoParam = function () {
    var res = 0;
    for (var i = 0, len = arguments.length; i < len; i++) {
        res += arguments[i];
    }
    return res;
}
alert(addNoParam(1, 3, 4, 5));      // 13

5.返回
當一個函式被呼叫時,它從第一條語句開始執行,直到最後的}結束
return語句可以讓函式提前退出執行。當return語句被呼叫,那麼return之後的語句不會被執行
當函式是構造器函式模式呼叫時,返回this,並非一個物件
return返回預設為undefined,如果沒有指定

相關文章