媒介: 前端這兩年的新技術遮天蔽日,種種框架、東西屢見不鮮頭昏眼花。近來盤算好好溫習下 js 基本,夯實的基本才是進修新技術的基石。本文作為讀書筆記簡樸的總結下 js 函數的基本知識。
一、函數對象
- JavaScript中的函數就是對象。對象是“名/值”對的集兼并具有一個銜接到原型對象的隱蔽銜接。對象字面量發生的對象銜接到Object.prototype。函數對象銜接到Function.prototype(該原型對象自身銜接到Object.prototype)。
- 每一個函數對象在建立時也會有一個prototype屬性。它的值是一個具有constructor屬性且值即為該函數的對象。
- 函數是對象,能夠保存在變量、對象和數組中。函數能夠當作參數通報給其他函數,函數也能夠在返回函數,函數具有要領。
二、函数字面量
函數對象經由歷程函数字面量來建立:
var add = function(a,b){
return a+b;
};
函数字面量包括四個部份:
- 1 保留字function
- 2 函數名(可省略)
- 3 包圍在括號中的一組參數,在函數被挪用是初始化為現實的參數的值
- 4 包圍在花括號里的一組語句塊
注重:一個內部函數除了能夠接見本身的參數和變量,同時也能夠自在的接見父函數的參數和變量。用過這類函数字面量建立的函數對象包括一個銜接到外部上下文的銜接。這個被稱為閉包
三、函數挪用
- 每一個函數吸收兩個附加的參數:this和arguments(現實參數),在JavaScript中有四種挪用體式格局:要領挪用情勢,函數挪用情勢,組織器挪用情勢和apply挪用情勢
要領挪用情勢
當有個函數被保存為對象的一個屬性是,我們稱他為一個要領。當以個要領被挪用時,this被綁定到該對像。
var myObject = {
value: 0,
increment: function (icn) {
this.value += typeof inc === 'number' ? icn: 1;
}
}
myObject.increment();
console.log(myObject.value);
myObject.increment(2);
console.log(myObject.value);
要領能夠運用this接見本身所屬的對象。經由歷程this可取可取的他們所屬對象的上下文的要領稱為大眾要領
函數挪用情勢
- 當一個函數並不是一個對象的屬性時,那末它就是被當作一個函數來挪用的,以此情勢挪用函數,this被綁定到了全局對象。這是毛病的,準確的設想應當是當內部函數被挪用時,this應當綁定到外部函數的this變量。因而聲明一個that變量並賦值this,內部函數就能夠經由歷程that接見到this。這個聽起來比較難明白,我們以代碼的情勢來申明
myObject.double = function(){
var that = this ;
var helper = function(){
that .value = add(that.value,that.value);
}
helper(); //以函數的情勢挪用helper
}
//以要領的情勢挪用double
myObject.double();
console.log(myObject.value);
組織器挪用情勢
- JavaScript是基於原型繼續的言語,對象能夠直接從其他對象繼屬性,該言語是無範例的。
- 假如在一個函數前面帶上new來挪用,name背地里就會建立一個銜接到該函數的prototype成員的新對象,同時this會綁定到新對象上
//建立一個組織器函數Quo
var Quo = function(string){
this.status = string;
};
//給Quo供應一個get_status的大眾要領
Quo.prototype.get_status = function(){
return this.status;
};
//組織一個Quo實例
var myQuo = new Quo("hello world");
console.log(myQuo.get_status());
Apply 挪用情勢
- apply要領能夠構建一個參數數組通報給挪用函數,apply要領吸收兩個數組,第一個是要綁定給this的值,第二個就是一個參數數組。
var array = [3,4];
var sum = add.apply(null,array);
var statusObject = {
status: 'A-ok'
};
var status = Quo.prototype.get_status.apply(statusObject);
console.log(status); //A-OK
參數
- 當函數被挪用時會獲得arguments數組,函數能夠經由歷程此參數接見一切被它挪用時通報的參數列表
arguments並不是一個真正的數組,具有一個length屬性,但它沒有任何數組的要領
返回
- 假如函數挪用時在前面加一個new前綴,且返回值不是一個對象,則返回this
四、函數作用域
- 我們已曉得,在代碼外部增加包裝函數將內部的變量和函數定義“隱蔽”起來,外部作用域無法接見包裝函數內部的任何東西 比方:
var a = 2;
function foo(){
var a =3;
consloe.log(a);//3
}
foo();
consloe.log(a);//2
閉包
- 內部函數能夠接見定義在他們外部的函數的變量和參數(除了this、arguments)
var que = function(status){
return {
get_status: function(){
return status;
}
}
}
var myQuo = que("hello");
console.log(myQuo.get_status());
get_status要領並不是接見參數的副本,他接見的就是參數的自身,這就是閉包,庇護status為私有屬性
回調callBack()
- 1 搞清異步和同步
function a(){
console.log('實行a函數');
setTimeout(function(){
console.log("執性a函數的耽誤函數")
},1000)
};
function b (){
console.log('實行函數b')
}
a();
b();
以上代碼會先實行函數a,而且不會比及a中的耽誤函數實行完才實行函數b, 在耽誤函數被觸發的歷程中就實行了函數b,當js引擎的event 行列空閑時才會去實行行列里守候的setTimeout的回調函數,這就是一個異步的例子
- 2回調函數究竟是什麼
以下是谷歌得出的結論
callback is a function that is passed as an argument to another function and is executed after its parent function has completed.
模塊
- 我們能夠運用函數和閉包來組織模塊,模塊是一個供應個託言卻隱蔽狀況與完成的函數或對象
- 模塊情勢應用函數作用域和閉包來建立被綁定對象與私有成員的關聯
- 模塊的平常情勢:一個定義了私有變量和函數的函數;應用閉包建立能夠接見私有變量和函數的特權,末了一個返回該特權函數,或許把它們保存在一個能夠接見的到的處所
模塊情勢須要具有兩個前提
- 1、必需有外部的封裝函數,該函數必需最少被挪用一次(每次挪用都邑建立一個新的模塊實例)。
- 2、關閉函數必需返回最少一個尼日不函數,如許內部函數才能在私有的作用域構成閉包,而且能夠接見或許能夠修正私有狀況。
var foo= (function(){
var something = 'cool';
var another =[1,2,3];
function doSomething(){
console.log(something);
}
function doAnother(){
console.log(another.join(' ! '));
}
return{
doSomething: doSomething,
doAnother: doAnother
}
})();
foo.doSomething();
foo.doAnother();