Javascript OOP -- 深刻理解函數

寫在前面 :

寫這篇文章計劃想了好久,終於付諸行動。一直不知道該從哪裏寫,或許文章有錯誤的地方,若是您發現了文章的錯誤,請指正!謝謝!
好句欣賞:
人生爲棋,我願爲卒行動雖慢可誰曾見我退後一步?數組


深刻函數與對象

函數就是一個特殊的對象(Object),是Function類的實例,其實在內存中存儲的操做是經過一個鍵值對來存儲.
函數雖然是一個對象,但和對象有必定的區別.函數

  • 函數的定義與內存模型:this

function fn1 () {
    alert('123');
}
var fn2 = fn1;

fn2();    //用fn2完成函數調用,結果是123

這段代碼我相信不少人都能看懂,咱們來看看它的內存模型:spa

function內存模型

舉個例子證實改變fn1的時候fn2並無改變,仍是上面的例子:code

function fn1 () {
    alert('123');
}
var fn2 = fn1;
fn1 = function () {
    alert('111');
};
fn2();    //用fn2完成函數調用,結果仍是123

經過上面的兩個例子,雖然fn2 = fn1可是他們指向的是不一樣的空間,咱們能夠證明了函數是經過對象的拷貝來完成。對象

  • 對象的定義與內存模型:blog

var obj1 = new Object();
var obj2 = obj1;
obj1.name = 'lee';

alert(obj2.name);    //lee

咱們來看看它的內存模型,畫的有點渣~๑乛◡乛๑排序

object內存模型

經過上面咱們就能夠看出,此時修改obj1或者obj2都會將兩個值完成修改,對象是經過引用來指向完成對象的賦值的.圖片

動態語言Javascript函數的靈活性

Javascript中函數真的有重載麼?ip

function sum (num1,num2){
    return num1 + num2;
}
function sum (num1){
    return num1 + 10;
}
alert(sum(10));    //20

咱們不難看出,結果爲20 <= (這是一句廢話)...咱們再看下面的代碼:

function sum (num1,num2){
    return num1 + num2;
}
function sum (num1){
    return num1 + 10;
}
alert(sum(10,20));    //??

咱們來思考一下,它的結果返回什麼?

result

沒錯,結果返回爲20。此時sum所指向的空間變成了一個,由於在JS中函數名相同的後面的會覆蓋前面。
特別注意:函數的傳入參數與調用無關!!!
若是調用傳入兩個參數,而形參只有一個,就只會匹配一個參數。
因此說,在Javascript中函數沒有重載的功能!

做爲值的傳遞

function fn (fun,arg){
    return fun(arg);
}
function say (str){
    alert('Hello'+str);
}
fn(say,'World');      //返回Hello World

動態語言的靈活性很是高,咱們不難看出函數還能夠做爲值傳遞到另外的一個函數中去調用.

做爲返回值 (一道例題引起的思考)

咱們先來講說數組的排序功能(sort),看例子:

var arr = [1,2,1,3,5,11];
 
console.log(arr.sort());    //[1, 1, 11, 2, 3, 5]

默認的排序是按字符串來排序的,這麼排序確定是咱們不但願看到的。咱們都知道sort()方法能夠傳遞一個函數,咱們來改進一下:

var arr = [1,2,1,3,5,11];

function bySort(num1,num2) {
    return num1 - num2;
}
console.log(arr.sort(bySort)); //[1, 1, 2, 3, 5, 11]

一切看起來都很正常,由於這是數字排序,那麼若是咱們想給對象排序呢?

function Fn (name,age) {
   this.name = name;
   this.age = age;
  }
 var p1 = new Fn('lee',23);
 var p2 = new Fn('zhangsan',33);
 var p3 = new Fn('Dave',13);
 var ps = [p1,p2,p3];
 ps.sort();        //無效!

圖片描述

咱們能夠按照剛纔的思路再寫一個給姓名的排序的函數,傳入進sort()中進行排序:

function sortByName(obj1,obj2){
   if (obj1.name > obj2.name)return 1;
   else if(obj1.name == obj2.name)return 0;
   else return -1;
}
 ps.sort(sortByName);

圖片描述

那麼問題來了,若是咱們要寫年齡排序呢?是否是還要寫一個方法,若是還有不少呢,好比地址按字母排序呢?咱們來按照函數做爲返回值來實現動態排序:

function sortByPro(dynamic) {
  function sortFn (obj1,obj2) {
    if (obj1[dynamic] > obj2[dynamic])return 1;
    else if (obj1[dynamic] == obj2[dynamic]) return 0;
    else return -1;
    }
  return sortFn;
 }
 ps.sort(sortByPro('age'));

圖片描述

就暫時先寫到這裏,這是不過是總結的一些小的技巧與心得,若是哪裏有錯誤請指正!謝謝!

*Brian.lee著*
相關文章
相關標籤/搜索