脚本宝典收集整理的这篇文章主要介绍了js實例教程-JS函數內部特殊對象this解析,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。小寶典致力於為廣大程序猿(媛)提供高品質的代碼服務,請大家多多光顧小站,小寶典在此謝過。
this是函數內部的一個特殊對象,它引用的是函數據以執行的環境對象。
全局環境下的this
當在網頁的全局作用域中調用函數時,this對象引用的就是window。
console.LOG(this);//Windowfunctionf(){returnthis;}f();//Window
在上邊這個例子中,調用函數f()之前,this的值並不確定,可能會在代碼執行過程中引用不同的對象。在全局環境中調用函數f()時,this引用的就是全局對象Window。
對象中的this
將一個函數賦給對象,通過對象調用這個函數,它們的this是調用該函數的對象。
VARo={ color:"blue", sayColor:function(){/ returnthis.color; } };o.sayColor();//blue
對象o有方法sayColor(),o.sayColor()被調用時,函數內部的this被綁定到o我們也可以用如下方法:
varo={color:"blue"};functionsayColor(){ returnthis.color;}o.sayColor=sayColor;o.sayColor();//blue
函數的名字僅僅是一個包含指針的變量,在何處定義調用函數不會影響到this的行為,全局的sayColor()與o.sayColor()指向的是同一個函數。
構造函數中的this
函數或方法之前帶有關鍵字new,它就構成了構造函數調用。通過構造函數生成一個新的對象,this指向新對象、
functionPErson(){ this.name="Jack";}varo=newPerson();console.log(o.name);//Jack
apply和call
每個函數都包含兩個方法,apply()和call()。這兩個方法的用途都是在特定的作用域中調用函數,可以設置函數體內this對象的值。
apply()方法接收兩個參數:一個是在其中運行函數的作用域,另一個是參數數組。其中,第二個參數可以是Array實例,也可以是arguments對象。
functionsum(num1,num2){ returnnum1+num2;}functioncallSum1(num1,num2){ returnsum.apply(this,arguments);}functioncallSum2(num1,num2){ returnsum.apply(this,[num1,num2]);}console.log(callSum1(10,10));//20console.log(callSum2(10,10));//20
上邊這個例子中,callSum1()在執行sum()函數時傳入了this作為this值(在作用域中調用的,傳入的就是window對象)和arguments對象。而callSum2()也調用了sum()函數,但傳入的是this和一個參數數組。
註:在嚴格模式下,未指定環境對象而調用函數,則this值不會被轉型為window,除非明確把函數添加到某個對象或者調用apply()或call(),否則this值是undefined。
call()與apply()方法作用相同,區別僅僅在於接收參數方式不同,對call()而言,第一個參數是this沒有變化,不同的是其餘參數都直接傳遞給函數,即在使用call()方法時,傳遞給函數的參數必須逐個列舉出來。
functionsum(num1,num2){ returnnum1+num2;}functioncallSum(num1,num2){ returnsum.call(this,num1,num2);}console.log(callSum(10,10));//20
call()和apply()真正強大的地方在於能擴充函數賴以運行的作用域。
window.color="red";varo={color:"blue"};functionsayColor(){ console.log(this.color);}sayColor();//redsayColor.call(this);//redsayColor.call(window);//redsayColor.call(o);//blue
使用call()或者apply()擴充作用域最大的好處,就是對象不需要與方法有任何耦合關係。
閉包中的this
閉包中使用this對象可能會導致一些問題,this對象在運行時是基於函數的執行環境對象的:在全局函數中,this等於window,而當函數被作為某個對象方法調用時,this等於那個對象。匿名函數的執行環境具有全局性,因此其this對象通常指向window。
varcolor="red";varo={ name:"blue", sayColor:function(){ returnfunction(){ returnthis.color; }; }}console.log(o.sayColor(());//red
varo={color:"blue",sayColor:function(){ varthat=this; returnfunction(){ returnthat.color; }; }}console.log(o.sayColor()());//blue
this是函數內部的一個特殊對象,它引用的是函數據以執行的環境對象。
全局環境下的this
當在網頁的全局作用域中調用函數時,this對象引用的就是window。
console.log(this);//Windowfunctionf(){returnthis;}f();//Window
在上邊這個例子中,調用函數f()之前,this的值並不確定,可能會在代碼執行過程中引用不同的對象。在全局環境中調用函數f()時,this引用的就是全局對象Window。
對象中的this
將一個函數賦給對象,通過對象調用這個函數,它們的this是調用該函數的對象。
varo={ color:"blue", sayColor:function(){/ returnthis.color; } };o.sayColor();//blue
對象o有方法sayColor(),o.sayColor()被調用時,函數內部的this被綁定到o我們也可以用如下方法:
varo={color:"blue"};functionsayColor(){ returnthis.color;}o.sayColor=sayColor;o.sayColor();//blue
函數的名字僅僅是一個包含指針的變量,在何處定義調用函數不會影響到this的行為,全局的sayColor()與o.sayColor()指向的是同一個函數。
構造函數中的this
函數或方法之前帶有關鍵字new,它就構成了構造函數調用。通過構造函數生成一個新的對象,this指向新對象、
functionPerson(){ this.name="Jack";}varo=newPerson();console.log(o.name);//Jack
apply和call
每個函數都包含兩個方法,apply()和call()。這兩個方法的用途都是在特定的作用域中調用函數,可以設置函數體內this對象的值。
apply()方法接收兩個參數:一個是在其中運行函數的作用域,另一個是參數數組。其中,第二個參數可以是Array實例,也可以是arguments對象。
functionsum(num1,num2){ returnnum1+num2;}functioncallSum1(num1,num2){ returnsum.apply(this,arguments);}functioncallSum2(num1,num2){ returnsum.apply(this,[num1,num2]);}console.log(callSum1(10,10));//20console.log(callSum2(10,10));//20
上邊這個例子中,callSum1()在執行sum()函數時傳入了this作為this值(在作用域中調用的,傳入的就是window對象)和arguments對象。而callSum2()也調用了sum()函數,但傳入的是this和一個參數數組。
註:在嚴格模式下,未指定環境對象而調用函數,則this值不會被轉型為window,除非明確把函數添加到某個對象或者調用apply()或call(),否則this值是undefined。
call()與apply()方法作用相同,區別僅僅在於接收參數方式不同,對call()而言,第一個參數是this沒有變化,不同的是其餘參數都直接傳遞給函數,即在使用call()方法時,傳遞給函數的參數必須逐個列舉出來。
functionsum(num1,num2){ returnnum1+num2;}functioncallSum(num1,num2){ returnsum.call(this,num1,num2);}console.log(callSum(10,10));//20
call()和apply()真正強大的地方在於能擴充函數賴以運行的作用域。
window.color="red";varo={color:"blue"};functionsayColor(){ console.log(this.color);}sayColor();//redsayColor.call(this);//redsayColor.call(window);//redsayColor.call(o);//blue
使用call()或者apply()擴充作用域最大的好處,就是對象不需要與方法有任何耦合關係。
閉包中的this
閉包中使用this對象可能會導致一些問題,this對象在運行時是基於函數的執行環境對象的:在全局函數中,this等於window,而當函數被作為某個對象方法調用時,this等於那個對象。匿名函數的執行環境具有全局性,因此其this對象通常指向window。
varcolor="red";varo={ name:"blue", sayColor:function(){ returnfunction(){ returnthis.color; }; }}console.log(o.sayColor(());//red
varo={color:"blue",sayColor:function(){ varthat=this; returnfunction(){ returnthat.color; }; }}console.log(o.sayColor()());//blue
覺得可用,就經常來吧!Javascript技巧 腳本寶典 歡迎評論哦! js技巧,巧奪天工,精雕玉琢。小寶典獻醜了!
以上是脚本宝典为你收集整理的js實例教程-JS函數內部特殊對象this解析全部内容,希望文章能够帮你解决js實例教程-JS函數內部特殊對象this解析所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。