1. 函數對象
在javascript中 函數就是對象 所以相對應的也會有原型 對象字面量創建的對象會連接到object.prototype
,而函數字面量創建的函數對象就會連接到function.prototype
。每個函數在創建時會有兩個隱藏屬性函數上下文
,函數需要行爲代碼
我理解爲要乾的事 和 參與者。
2. 函數調用
函數的調用可以理解爲控制權的轉移,把參數和控制器傳入被調用的函數中,函數被調用時有兩個附加參數 this
和arguments
.this的值在不同調用模式下值不同,js有四種調用模式:方法調用模式,函數調用模式,構造器調用模式,apply調用模式。
javascript對於實參傳遞要求比較寬鬆 允許實參形參數量不一 且不對實參的類型做檢查
3. 方法調用模式
什麼是方法? 我們認爲把一個函數封裝在一個對象裏面,這個函數就是這個對象的方法
在對象的方法內可以調用this這時的this表示了當前的對象,通過這個this你可以獲取到這個對象的上下文屬性 這種方法叫做公共方法
var cat = {
height:66,
weight:55,
num:function () {
return this.height+this.weight;
}
}
4. 函數調用模式
function add(a,b) {
return a+b;
}
var sum = add(3,4);
當一個函數不是某個對象的方法時,被調用時的this指向爲一個全局對象
但我們通常的需求是綁定爲外部函數的this 我們可以這樣做
cat.double = function () {
var that = this;
that.value = 3;
//
var helper = function () {
that.value = add(that.value,that.value);
}
helper();
}
cat.double();
console.log(cat.value);//這裏面還是訪問的cat而不是cat.double.value因爲這裏的double你理解爲這個對象的方法而不是什麼子類對象 這裏的this還是其cat本身
5. 構造器模式
所謂的構造器就是new的時候創建的工具 那麼javascript當方法被構造的時候 他會創建一個方法的副本 並且this指向這個new出來的對象 他的原型被鏈接成原對象的原型 比如下方
var a = function (string) {
this.status = string;
}
a.prototype.getStatus =function () {
return this.status;
}//爲所有a的原型創建了一個getStatus方法
var b = new a("hellow");
//綁定this爲b 也就是b的status爲hellow
console.log(b.getStatus());
//調用時通過原型查找到getStatus方法 並返回this也就是b的status字符串
//所以這個實驗證明了兩點 第一new會讓當前對象綁定爲this 第二 當前對象的原型會綁定到a的原型
但據說這樣不太好使
6. apply調用模式
javascript是一門以函數爲核心的語言 所以他的函數也有方法
var array = [3,4];
var sum = add.apply(null,array);
//通過apply我們可以重新指定this所指向的對象 這裏爲null 第二個參數爲參數數組
console.log(sum);
var statusObject = {
status:"WoW"
}
console.log(a.prototype.getStatus.apply(statusObject));
//這裏儘管statusObject的原型和a的原型並沒有任何關係 但因爲調用了apply方法 所以this被重新定向爲statusObject 返回了他的status:"WoW"
var a = function (string) {
this.status = string;
}
a.print = function () {
}
a.print.println = function () {
console.log("fk");
}
a.print.println();
a.prototype.getStatus =function () {
return this.status;
既然上面說了函數能狗擁有方法 這是我能唯一想到並且可以執行的方法添加方法 就是通過給函數對象添加函數屬性 如果是在裏面直接函數字面量聲明並不行 似乎是因爲這是一個函數對象