摘要:寫在前面寫這篇文章計(jì)劃想了很久,終于付諸行動(dòng)。此時(shí)所指向的空間變成了一個(gè),因?yàn)樵谥泻瘮?shù)名相同的后面的會覆蓋前面。特別注意函數(shù)的傳入?yún)?shù)與調(diào)用無關(guān)如果調(diào)用傳入兩個(gè)參數(shù),而形參只有一個(gè),就只會匹配一個(gè)參數(shù)。
寫在前面 :
寫這篇文章計(jì)劃想了很久,終于付諸行動(dòng)。一直不知道該從哪里寫,或許文章有錯(cuò)誤的地方,如果您發(fā)現(xiàn)了文章的錯(cuò)誤,請指正!謝謝!
好句欣賞:
人生為棋,我愿為卒行動(dòng)雖慢可誰曾見我退后一步?
函數(shù)就是一個(gè)特殊的對象(Object),是Function類的實(shí)例,其實(shí)在內(nèi)存中存儲的操作是通過一個(gè)鍵值對來存儲.
函數(shù)雖然是一個(gè)對象,但和對象有一定的區(qū)別.
函數(shù)的定義與內(nèi)存模型:
function fn1 () { alert("123"); } var fn2 = fn1; fn2(); //用fn2完成函數(shù)調(diào)用,結(jié)果是123
這段代碼我相信很多人都能看懂,我們來看看它的內(nèi)存模型:
舉個(gè)例子證明改變fn1的時(shí)候fn2并沒有改變,還是上面的例子:
function fn1 () { alert("123"); } var fn2 = fn1; fn1 = function () { alert("111"); }; fn2(); //用fn2完成函數(shù)調(diào)用,結(jié)果還是123
通過上面的兩個(gè)例子,雖然fn2 = fn1但是他們指向的是不同的空間,我們可以證實(shí)了函數(shù)是通過對象的拷貝來完成。
對象的定義與內(nèi)存模型:
var obj1 = new Object(); var obj2 = obj1; obj1.name = "lee"; alert(obj2.name); //lee
我們來看看它的內(nèi)存模型,畫的有點(diǎn)渣~?乛?乛?
通過上面我們就可以看出,此時(shí)修改obj1或者obj2都會將兩個(gè)值完成修改,對象是通過引用來指向完成對象的賦值的.
動(dòng)態(tài)語言Javascript函數(shù)的靈活性Javascript中函數(shù)真的有重載么?
function sum (num1,num2){ return num1 + num2; } function sum (num1){ return num1 + 10; } alert(sum(10)); //20
我們不難看出,結(jié)果為20 <= (這是一句廢話)...我們再看下面的代碼:
function sum (num1,num2){ return num1 + num2; } function sum (num1){ return num1 + 10; } alert(sum(10,20)); //??
我們來思考一下,它的結(jié)果返回什么?
沒錯(cuò),結(jié)果返回為20。此時(shí)sum所指向的空間變成了一個(gè),因?yàn)樵贘S中函數(shù)名相同的后面的會覆蓋前面。
特別注意:函數(shù)的傳入?yún)?shù)與調(diào)用無關(guān)?。?!
如果調(diào)用傳入兩個(gè)參數(shù),而形參只有一個(gè),就只會匹配一個(gè)參數(shù)。
所以說,在Javascript中函數(shù)沒有重載的功能!
作為值的傳遞
function fn (fun,arg){ return fun(arg); } function say (str){ alert("Hello"+str); } fn(say,"World"); //返回Hello World
動(dòng)態(tài)語言的靈活性非常高,我們不難看出函數(shù)還可以作為值傳遞到另外的一個(gè)函數(shù)中去調(diào)用.
作為返回值 (一道例題引發(fā)的思考)
我們先來說說數(shù)組的排序功能(sort),看例子:
var arr = [1,2,1,3,5,11]; console.log(arr.sort()); //[1, 1, 11, 2, 3, 5]
默認(rèn)的排序是按字符串來排序的,這么排序肯定是我們不希望看到的。我們都知道sort()方法可以傳遞一個(gè)函數(shù),我們來改進(jìn)一下:
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]
一切看起來都很正常,因?yàn)檫@是數(shù)字排序,那么如果我們想給對象排序呢?
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(); //無效!
我們可以按照剛才的思路再寫一個(gè)給姓名的排序的函數(shù),傳入進(jìn)sort()中進(jìn)行排序:
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);
那么問題來了,如果我們要寫年齡排序呢?是不是還要寫一個(gè)方法,如果還有很多呢,比如地址按字母排序呢?我們來按照函數(shù)作為返回值來實(shí)現(xiàn)動(dòng)態(tài)排序:
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"));
就暫時(shí)先寫到這里,這是不過是總結(jié)的一些小的技巧與心得,如果哪里有錯(cuò)誤請指正!謝謝!
*Brian.lee著*
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/82476.html
摘要:構(gòu)造函數(shù)通過原型繼承了構(gòu)造函數(shù)和原型,這就形成了一個(gè)鏈條,通俗的講就是原型鏈繼承。而且方法只能冒充構(gòu)造函數(shù)里面的屬性和方法而無法冒充原型對象里面的屬性和方法還有最大的問題就是重復(fù)使用。 前言: 寫到這里,差不多就把OOP完結(jié)了,寫了幾篇OOP的文章,但是只是略懂皮毛,可能深入的OOP還有很多,但是我感覺寫到這里也算是差不多完結(jié)了。 繼承 繼承是面向?qū)ο蟊容^核心的概念,其他語言可能實(shí)現(xiàn)...
摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當(dāng)作缺點(diǎn)提及,但是只要善于運(yùn)用,其實(shí)基于原型的繼承模型比傳統(tǒng)的類繼承還要強(qiáng)大。中文指南基本操作指南二繼續(xù)熟悉的幾對方法,包括,,。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。 怎樣使用 this 因?yàn)楸救藢儆趥吻岸?,因此文中只看懂?8 成左右,希望能夠給大家?guī)韼椭?...(據(jù)說是阿里的前端妹子寫的) this 的值到底...
摘要:支持形式的調(diào)用這其實(shí)是非常經(jīng)典的無構(gòu)造,其實(shí)就是一個(gè)構(gòu)造函數(shù),的結(jié)果就是一個(gè)對象實(shí)例,該實(shí)例有個(gè)屬性,屬性值是。 前言 終于,樓主的「Underscore 源碼解讀系列」underscore-analysis 即將進(jìn)入尾聲,關(guān)注下 timeline 會發(fā)現(xiàn)樓主最近加快了解讀速度。十一月,多事之秋,最近好多事情搞的樓主心力憔悴,身心俱疲,也想盡快把這個(gè)系列完結(jié)掉,也好了卻一件心事。 本文...
摘要:原型的概念不同于構(gòu)造函數(shù)模式創(chuàng)建對象只能單級即成,得益于原型鏈的概念,原型模式可實(shí)現(xiàn)類似其他語言的多級繼承。組合使用構(gòu)造函數(shù)與原型模式單一使用原型對象的問題在于所有屬性皆共享,若不想共享某屬性,則可放入構(gòu)造函數(shù)中。 之前提到,構(gòu)造函數(shù)方法創(chuàng)建對象存在著方法不共享的問題,因此引申出了原型模式創(chuàng)建對象 原型模式 原型模式旨在創(chuàng)建一個(gè)模版對象,該對象的所有屬性和方法被其實(shí)例所共享。 原型的概...
摘要:的作用在中,方法和方法都是為了改變函數(shù)運(yùn)行時(shí)上下文而存在的,換句話說就是為了改變函數(shù)體內(nèi)部的指向。歡迎前端大牛糾正錯(cuò)誤,如有錯(cuò)誤我會及時(shí)改正。 寫在前面: 隔了很長時(shí)間了,也不知道寫點(diǎn)什么。最近一直在研究ES6,一直想寫出來的文章能對初學(xué)者或者是在學(xué)習(xí)JS路上有所幫助的。這就是我的初衷。 call、apply的作用 在JavaScript中,call()方法和apply()方法都是為了...
閱讀 1057·2023-04-25 17:51
閱讀 2863·2021-11-23 09:51
閱讀 1486·2021-11-08 13:21
閱讀 2461·2021-09-22 15:14
閱讀 1527·2019-08-30 12:48
閱讀 1089·2019-08-29 12:44
閱讀 1146·2019-08-26 12:21
閱讀 1404·2019-08-26 10:47