js實例教程-JS函數內部特殊對象this解析

发布时间:2018-11-23 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了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,请注明来意。