摘要:構(gòu)造器調(diào)用模式一個(gè)函數(shù),如果創(chuàng)建的目的就是希望結(jié)合前綴來(lái)調(diào)用,那就被稱(chēng)為構(gòu)造函數(shù)如果一個(gè)函數(shù)前面帶上來(lái)調(diào)用,那么就會(huì)創(chuàng)建一個(gè)連接到該函數(shù)的原型成員的新對(duì)象,同時(shí)函數(shù)中的會(huì)綁定到這個(gè)新對(duì)象中。
函數(shù) 函數(shù)對(duì)象
首先來(lái)理解一下什么事對(duì)象:ECMA-262是這樣定義的“無(wú)序?qū)傩缘募?,其屬性可以包含基本值、?duì)象或者函數(shù)”,也就是說(shuō),對(duì)象是‘名/值’對(duì)的集合。
var person=new Object(); person.name="Jake"; person.age=18; person.sayName=function(){ alert(this.name); }
上面的例子創(chuàng)建了一個(gè)名為person的對(duì)象,并為它添加了兩個(gè)屬性:name、age和一個(gè)方法sayName。其中sayName用于顯示this.name(將被解析為person.name)的值。
函數(shù)字面量我們來(lái)看一段代碼:
var add=function(a,b){ return a+b; }
函數(shù)字面量包含4個(gè)部分,分別是:
保留字 function
函數(shù)名 add
參數(shù) a、b
語(yǔ)句 return a+b;
函數(shù)字面量可以出現(xiàn)在任何允許出現(xiàn)的地方,也可以定義在其他函數(shù)中。一個(gè)內(nèi)部函數(shù)除了可以訪問(wèn)自己的參數(shù)和變量,同時(shí)它也能自由地訪問(wèn)它的父函數(shù)的變量和參數(shù)。通過(guò)函數(shù)字面量創(chuàng)建的函數(shù)對(duì)象包含一個(gè)連接到外部上下文的鏈接。這被稱(chēng)為閉包
閉包閉包這個(gè)概念是js這門(mén)語(yǔ)言中一個(gè)非常重要而且是很難掌握的知識(shí)點(diǎn)!
這里只能淺顯地解釋一下什么是閉包
我們用一些代碼來(lái)解釋這個(gè)定義:
function foo(){ var a=2; function bar(){ console.log(a); } return bar; } var baz=foo(); baz();//2 <--這就是閉包的效果
函數(shù)bar()的詞法作用域能夠訪問(wèn)foo()內(nèi)部作用域,然后將bar()函數(shù)本身當(dāng)作一個(gè)值類(lèi)型進(jìn)行傳遞。
在foo執(zhí)行后,其返回值 bar()賦值給變量baz并調(diào)用baz(),實(shí)際上只是通過(guò)不同的標(biāo)識(shí)符引用調(diào)用了內(nèi)部的函數(shù)bar()。
在foo執(zhí)行后,foo內(nèi)部作用域不會(huì)被銷(xiāo)毀,因?yàn)橐恢倍际莃ar()本身在使用,所喲foo內(nèi)部作用域依然存在且能夠一直存活,以供bar隨時(shí)進(jìn)行引用。
bar依然對(duì)該作用域保持引用,而這個(gè)引用就叫作閉包。
作用域的作用:控制著變量與參數(shù)的可見(jiàn)性以及生命周期。
定義在函數(shù)內(nèi)部的參數(shù)和變量在函數(shù)外部是不可見(jiàn)的,而在一個(gè)函數(shù)內(nèi)部任何位置定義的變量,在函數(shù)內(nèi)部任何位置都可見(jiàn)。
var f00=function(){ var a=3,b=5; var bar=function(){ var b=7,c=11; //此時(shí)a=3,b=7,c=11; a+=b+c; //此時(shí)a=21,b=7,c=11; }; //此a=3,b=5,c沒(méi)有定義; bar(); //此時(shí)a=21,b=5; }調(diào)用
調(diào)用一個(gè)函數(shù)會(huì)暫停當(dāng)前函數(shù)的執(zhí)行,傳遞控制權(quán)和參數(shù)給新函數(shù)。js提供了四種調(diào)用模式:方法調(diào)用模式、函數(shù)調(diào)用模式、構(gòu)造器調(diào)用模式以及apply調(diào)用模式。
方法調(diào)用模式
當(dāng)一個(gè)函數(shù)被保存為對(duì)象的一個(gè)屬性是,我們稱(chēng)之為方法。當(dāng)一個(gè)方法被調(diào)用時(shí),this被綁定到該對(duì)象,當(dāng)對(duì)象與方法用“.”來(lái)連接時(shí),那么它就被當(dāng)作一個(gè)方法來(lái)調(diào)用了。
var person={ name:"Jake", age:18, sayAge:function(age){ this.age=age; } }; person.sayAge(19); docunment.writeln(person.age);//19
2.函數(shù)調(diào)用模式
當(dāng)一個(gè)函數(shù)并不是一個(gè)對(duì)象的屬性時(shí),那么它就是被當(dāng)作一個(gè)函數(shù)來(lái)調(diào)用的
var myobject={ } //添加一個(gè)新的方法 myObject.do=function(value){ this.value=value; var that=this; var helper=function(){ that.value=that.value+that.value; }; helper(); } myObject.do(3); console.log(myObject.value)//6
這里面遇到一個(gè)問(wèn)題,就是在helper函數(shù)內(nèi)部的this指向的時(shí)這個(gè)函數(shù)本省,而不是全局對(duì)象。我們找到一個(gè)很好的解決方法,那就是將this賦值給一個(gè)全新的變量that,那么內(nèi)部函數(shù)就可以訪問(wèn)到this,這樣就避免了內(nèi)部函數(shù)里面的this錯(cuò)誤的綁定。
3 構(gòu)造器調(diào)用模式
一個(gè)函數(shù),如果創(chuàng)建的目的就是希望結(jié)合new前綴來(lái)調(diào)用,那就被稱(chēng)為構(gòu)造函數(shù)
如果一個(gè)函數(shù)前面帶上new來(lái)調(diào)用,那么就會(huì)創(chuàng)建一個(gè)連接到該函數(shù)的prototype(原型)成員的新對(duì)象,同時(shí)函數(shù)中的this會(huì)綁定到這個(gè)新對(duì)象中。
var Myobject=function(string){ this.status=string; } Myobject.prototype.get_status=function(){ return this.status; } //創(chuàng)建實(shí)例 var newObj=new Myobject("Hello !"); console.log(newObj.get_status()); //Hello !
這里要特別注意:按照慣例,構(gòu)造函數(shù)始終都應(yīng)該以一個(gè)大寫(xiě)字母開(kāi)頭,而非構(gòu)造函數(shù)則應(yīng)該以一個(gè)小寫(xiě)字母開(kāi)頭。
4.Apply調(diào)用模式
Apply方法讓我們構(gòu)建一個(gè)參數(shù)組傳遞給調(diào)用函數(shù)。它允許我們選擇this的值。Apply方法接受兩個(gè)參數(shù),第一個(gè)要綁定給this的值,第二個(gè)就是參數(shù)數(shù)組。
var array=[3,4]; var sum=add.apply(null,array);//sum值為 7
var statusObj={ status:"Hello" }; var status=Quo.prototype.get_status.apply(statusObj); //status值為‘Hello’
function SpeciallArray(){ var values=new Array(); values.push.apply(values,arguments); values.toPipedString=function(){ return this.join("|"); } return values; } var color=new SpeciallArray("blue","yellow","red"); console.log(colo.toPipedString); //"blue|yellow|red"
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/107736.html
摘要:除此以外,讓元素脫離文檔流也是一個(gè)很好的方法。因?yàn)樵匾坏┟撾x文檔流,它對(duì)其他元素的影響幾乎為零,性能的損耗就能夠有效局限于一個(gè)較小的范圍。講完重排與重繪,往元素上綁定事件也是引起性能問(wèn)題的元兇。高性能這本書(shū)非常精致,內(nèi)容也非常豐富。 showImg(https://segmentfault.com/img/bVJgbt?w=600&h=784); 入手《高性能JavaScript》一...
摘要:入門(mén)系列之時(shí)間及時(shí)間戳?xí)r間及時(shí)間戳?xí)r間及時(shí)間戳是里面很常見(jiàn)的一個(gè)概念,在我們寫(xiě)前端頁(yè)面的時(shí)候,經(jīng)常會(huì)遇到需要獲取當(dāng)前時(shí)間的情況,所以,了解中的時(shí)間概念非常重要。 js入門(mén)系列之 時(shí)間及時(shí)間戳 時(shí)間及時(shí)間戳 時(shí)間及時(shí)間戳是js里面很常見(jiàn)的一個(gè)概念,在我們寫(xiě)前端頁(yè)面的時(shí)候,經(jīng)常會(huì)遇到需要獲取當(dāng)前時(shí)間的情況,所以,了解js中的時(shí)間概念非常重要。而時(shí)間戳是指格林威治時(shí)間1970年01月0...
摘要:入門(mén)系列之時(shí)間及時(shí)間戳?xí)r間及時(shí)間戳?xí)r間及時(shí)間戳是里面很常見(jiàn)的一個(gè)概念,在我們寫(xiě)前端頁(yè)面的時(shí)候,經(jīng)常會(huì)遇到需要獲取當(dāng)前時(shí)間的情況,所以,了解中的時(shí)間概念非常重要。 js入門(mén)系列之 時(shí)間及時(shí)間戳 時(shí)間及時(shí)間戳 時(shí)間及時(shí)間戳是js里面很常見(jiàn)的一個(gè)概念,在我們寫(xiě)前端頁(yè)面的時(shí)候,經(jīng)常會(huì)遇到需要獲取當(dāng)前時(shí)間的情況,所以,了解js中的時(shí)間概念非常重要。而時(shí)間戳是指格林威治時(shí)間1970年01月0...
摘要:入門(mén)這部分內(nèi)容的目標(biāo)是簡(jiǎn)單地介紹,我們首先講如何用來(lái)實(shí)現(xiàn)一個(gè)旋轉(zhuǎn)的立方體。具體的實(shí)例將會(huì)給出,以防你卡住或者需要幫助。透視投影照相機(jī)的構(gòu)造函數(shù)是,其中是可視角度為,通常是容器的寬高比是近斷距離,是遠(yuǎn)端距離。 入門(mén) 這部分內(nèi)容的目標(biāo)是簡(jiǎn)單地介紹three.js,我們首先講如何用three.js來(lái)實(shí)現(xiàn)一個(gè)旋轉(zhuǎn)的立方體。具體的實(shí)例將會(huì)給出,以防你卡住或者需要幫助。 在html文件中引入thr...
閱讀 579·2021-10-09 09:44
閱讀 2371·2021-09-02 15:41
閱讀 3641·2019-08-30 15:53
閱讀 1901·2019-08-30 15:44
閱讀 1361·2019-08-30 13:10
閱讀 1303·2019-08-30 11:25
閱讀 1556·2019-08-30 10:51
閱讀 3440·2019-08-30 10:49