Javascript中有幾個非常重要的語言特性——對象、原型繼承、閉包。其中閉包 對于那些使用傳統(tǒng)靜態(tài)語言C/C++的程序員來說是一個新的語言特性,本文給大家介紹js的閉包,原型,和匿名函數(shù)之旅,感興趣的朋友一起學習吧
本文通過示例給大家介紹javascript的閉包,原型,和匿名函數(shù),具體詳情請看下文。
一 .>關(guān)于閉包
理解閉包 需要的知識
1.變量的作用域
例1:
- var n =99; //建立函數(shù)外的全局變量
- function readA(){
- alert(n); //讀取全局變量
- }
readA(); //執(zhí)行此函數(shù)
例2:
- function readB(){
- var c = 9;
- function readC(){
- console.log(c); //ok c可見
- }
- return readC;
- }
- alert(c); //error c is not defined.
note: 函數(shù)內(nèi)部聲明變量c時,一定要加上 var,否則 c會成為一個全局變量
所以函數(shù)內(nèi)可見全局變量,函數(shù)內(nèi)的局部變量卻對外不可見
js的作用域是鏈式的,父對象里的變量總對子對象可見,子對象的對象卻對父對象不可見
當我們要獲取函數(shù)內(nèi)的內(nèi)部變量
于是有了例3:
- function readB(){
- var c = 9;
- function readC(){
- console.log(c);
- }
- return readC();
- }
- readB();
閉包很類似基于此做了一個變式
- function readB(){
- var c = 9;
- function readC(){
- console.log(c);
- }
- return readC;
- }
- var res = readB();
- res();
note:
1.慎用閉包,注意內(nèi)存占用,因為它會保存父函數(shù)的狀態(tài)
2.不要隨便改變父函數(shù)內(nèi)部變量的值
理解閉包
note: this 指包含它的函數(shù)被執(zhí)行時所屬的對象
例1:
- var name = "The Window";
- var object = {
- name : "My Object",
- getNameFunc : function(){ //此時this (這個執(zhí)行函數(shù))是屬于object對象的,是object對象下的一個屬性的值
- return function(){ //此時this (這個執(zhí)行函數(shù))是一個匿名函數(shù),從根對象window生成,是屬于window
- return this.name;
- };
- }
- };
- console.log(object.getNameFunc()()); //the window
例2:
- var name = "The Window";
- var object = {
- name : "My Object",
- getNameFunc : function(){
- var that = this;
- return function(){
- return that.name;
- };
- }
- };
- console.log(object.getNameFunc()()); //My Object
二 .>匿名函數(shù)
直接定義一個匿名函數(shù) 然后調(diào)用這個匿名函數(shù),這種形式在jquery插件的定義時很常見
1.通過函數(shù)字母量的方式. 先聲明一個匿名函數(shù),然后執(zhí)行它
- ( function(){
- console.log('excute self');
- }) ();
2.通過優(yōu)先表達式的方式 , 由于Javascript執(zhí)行表達式是從圓括號里面到外面,所以可以用圓括號強制執(zhí)行聲明的函數(shù)
- (
- function () {
- alert(2);
- }
- ()
- );
3.void操作符 用void操作符去執(zhí)行一個沒有用圓括號包圍的一個單獨操作數(shù)
- void function(){ console.log('void') } ();
三 .>關(guān)于prototype
原型 prototype
理解js中的protitype首先需要明白js的面向?qū)ο笤O計
- function People(name){
- this.name = name;
- console.log(this); //Window 或者 object { name: 'xxx' }
- this.introduce = function(){ //實例對象方法
- console.log(this.name);
- }
- }
- new People('leon').introduce();
- //這里有一個非常有趣的現(xiàn)象,結(jié)合前面的來看的話,
- //首先function people里的this指向的默認是Window對象
- //當 調(diào)用 People();時 this 輸出為 Window對象
- //但一旦調(diào)用new People('xx')時, this 輸出為 {name:'xx'}
- //其實也很好理解,一旦new ,便新建了一個對象
實例對象方法只能這樣 new People('leon').introduce(); 調(diào)用 因為它使用前必須初始化
類的對象的靜態(tài)方法
- var People = {}; //等于一個對象 {} 或者 function 數(shù)組都可以 此時People需要是引用類型
- People.sayhi = function(to_who){
- console.log('hi '+ to_who);
- }
- People.sayhi('lee'); //調(diào)用時這樣調(diào)用
原型方法
- var People = function(){}; // People 必須為一個 function(){} 即為一個類,不能是對象或值類型或其他引用類型
- People.prototype.meet = function(meet_who) {
- console.log('I am '+this.name + ',going to meet ' + meet_who);
- };
- new People('lee').meet('xx');
原型方法只能由該類的對象 調(diào)用
A.prototype = new B();
原型看起來很像繼承,但其實不是,它更像clone更準確
如果出現(xiàn)了父類和子類出現(xiàn)了重名的屬性,采取就近原則,如果找不到一級一級向上找,如果要指定調(diào)用上級的屬性,使用call方法
- extendClass.prototype = new baseClass();
- var instance = new extendClass();
- var baseinstance = new baseClass();
- baseinstance.showMsg.call(instance);
- obj1.func.call(obj);
以上內(nèi)容是小編給大家分享的學習javascript的閉包,原型,和匿名函數(shù)之旅,希望對大家有用。
新聞熱點
疑難解答
圖片精選