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