亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript中this詳解

2019-11-20 11:37:34
字體:
來源:轉載
供稿:網友

這里的主題是 this ,不扯遠了。this 本身原本很簡單,總是指向類的當前實例,this 不能賦值。這前提是說 this 不能脫離 類/對象 來說,也就是說 this 是面向對象語言里常見的一個關鍵字。說的極端點,如果你編寫的 JS 采用函數式寫法,而不是面向對象式,你所有的代碼里 this 會少很多,甚至沒有。記住這一點,當你使用 this 時,你應該是在使用對象/類 方式開發,否則 this 只是函數調用時的副作用。

JavaScript中的this總是讓人迷惑,應該是js眾所周知的坑之一。 個人也覺得js中的this不是一個好的設計,由于this晚綁定的特性,它可以是全局對象,當前對象,或者…有人甚至因為坑大而不用this。

其實如果完全掌握了this的工作原理,自然就不會走進這些坑。來看下以下這些情況中的this分別會指向什么:

1.全局代碼中的this

alert(this)//window

全局范圍內的this將會指向全局對象,在瀏覽器中即使window。

2.作為單純的函數調用

function fooCoder(x) { this.x = x;}fooCoder(2);alert(x);// 全局變量x值為2

這里this指向了全局對象,即window。在嚴格模式中,則是undefined。

3.作為對象的方法調用

var name = "clever coder";var person = { name : "foocoder", hello : function(sth){  console.log(this.name + " says " + sth); }}person.hello("hello world");

輸出 foocoder says hello world。this指向person對象,即當前對象。

4.作為構造函數

new FooCoder();

函數內部的this指向新創建的對象。

5.內部函數

var name = "clever coder";var person = { name : "foocoder", hello : function(sth){  var sayhello = function(sth) {   console.log(this.name + " says " + sth);  };  sayhello(sth); }}person.hello("hello world");//clever coder says hello world

在內部函數中,this沒有按預想的綁定到外層函數對象上,而是綁定到了全局對象。這里普遍被認為是JavaScript語言的設計錯誤,因為沒有人想讓內部函數中的this指向全局對象。一般的處理方式是將this作為變量保存下來,一般約定為that或者self:

var name = "clever coder";var person = { name : "foocoder", hello : function(sth){  var that = this;  var sayhello = function(sth) {   console.log(that.name + " says " + sth);  };  sayhello(sth); }}person.hello("hello world");//foocoder says hello world

6.使用call和apply設置this

person.hello.call(person, "world");

apply和call類似,只是后面的參數是通過一個數組傳入,而不是分開傳入。兩者的方法定義:

call( thisArg [,arg1,arg2,… ] ); // 參數列表,arg1,arg2,...apply(thisArg [,argArray] );  // 參數數組,argArray

兩者都是將某個函數綁定到某個具體對象上使用,自然此時的this會被顯式的設置為第一個參數。

簡單地總結

簡單地總結以上幾點,可以發現,其實只有第六點是讓人疑惑的。

其實就可以總結為以下幾點:

1.當函數作為對象的方法調用時,this指向該對象。

2.當函數作為淡出函數調用時,this指向全局對象(嚴格模式時,為undefined)

3.構造函數中的this指向新創建的對象

4.嵌套函數中的this不會繼承上層函數的this,如果需要,可以用一個變量保存上層函數的this。

再總結的簡單點,如果在函數中使用了this,只有在該函數直接被某對象調用時,該this才指向該對象。

obj.foocoder();foocoder.call(obj, ...);foocoder.apply(obj, …);

更進一步

我們可能經常會寫這樣的代碼:

$("#some-ele").click = obj.handler;

如果在handler中用了this,this會綁定在obj上么?顯然不是,賦值以后,函數是在回調中執行的,this會綁定到$(“#some-div”)元素上。這就需要理解函數的執行環境。本文不打算長篇贅述函數的執行環境,可以參考《javascript高級程序設計》中對執行環境和作用域鏈的相關介紹。這里要指出的時,理解js函數的執行環境,會更好地理解this。

那我們如何能解決回調函數綁定的問題?ES5中引入了一個新的方法,bind():

fun.bind(thisArg[, arg1[, arg2[, ...]]]) thisArg

當綁定函數被調用時,該參數會作為原函數運行時的this指向.當使用new 操作符調用綁定函數時,該參數無效.

arg1, arg2, ...

當綁定函數被調用時,這些參數加上綁定函數本身的參數會按照順序作為原函數運行時的參數.
該方法創建一個新函數,稱為綁定函數,綁定函數會以創建它時傳入bind方法的第一個參數作為this,傳入bind方法的第二個以及以后的參數加上綁定函數運行時本身的參數按照順序作為原函數的參數來調用原函數.

顯然bind方法可以很好地解決上述問題。

$("#some-ele").click(person.hello.bind(person));//相應元素被點擊時,輸出foocoder says hello world

其實該方法也很容易模擬,我們看下Prototype.js中bind方法的源碼:

Function.prototype.bind = function(){ var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift(); return function(){ return fn.apply(object,  args.concat(Array.prototype.slice.call(arguments))); };};

相信看完全文以后,this不再是坑~,大家都明白了嗎,欲了解更多請點擊武林網的網站學習。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区在线免费视频| 91在线中文字幕| 亚洲女人天堂视频| 中文字幕在线看视频国产欧美在线看完整| 国产欧美日韩免费看aⅴ视频| 一个人www欧美| 国产亚洲欧美日韩精品| 亚洲精品久久久久中文字幕二区| 成人在线视频网站| 日韩视频免费在线观看| 亚洲最新av在线网站| 精品色蜜蜜精品视频在线观看| 亚洲国产精品小视频| 另类视频在线观看| 精品久久久久久国产91| 91av在线免费观看视频| 欧美在线视频免费观看| 亚洲第一精品电影| 精品国产鲁一鲁一区二区张丽| 久久久久久久999精品视频| 青青久久av北条麻妃黑人| 中文字幕精品久久久久| 国产精品久久一区主播| 伊人成人开心激情综合网| 欧美黑人一级爽快片淫片高清| 成人国产精品一区二区| 精品一区二区三区电影| 久久躁日日躁aaaaxxxx| 亚洲自拍中文字幕| 97久久精品人人澡人人爽缅北| 国产精品精品一区二区三区午夜版| 国产亚洲一级高清| 国产精品99导航| 国产精品成人av性教育| 亚洲精品自拍偷拍| 一区二区三区 在线观看视| 日韩av色综合| 欧美激情按摩在线| 国产脚交av在线一区二区| 精品色蜜蜜精品视频在线观看| 亚洲精品国产福利| 日韩女优人人人人射在线视频| 亚洲国产另类 国产精品国产免费| 国产欧美日韩免费看aⅴ视频| 久久视频在线观看免费| 国产亚洲精品91在线| 久久99国产综合精品女同| 久久综合久久八八| 亚洲精品久久久久久久久久久| 美女黄色丝袜一区| 日韩免费av片在线观看| 高清欧美电影在线| 日韩成人网免费视频| 久久夜色精品亚洲噜噜国产mv| 国内精品400部情侣激情| 欧美中文在线视频| 国产日韩一区在线| 欧美中文在线视频| 日韩免费在线视频| 国产亚洲福利一区| 国产精品久久电影观看| 7m第一福利500精品视频| 中文字幕无线精品亚洲乱码一区| 久久精品电影一区二区| 日韩在线观看网址| 欧美亚洲激情视频| 一本大道香蕉久在线播放29| 国产精品久久久久av免费| 日韩中文字幕在线看| 欧美又大又粗又长| 亚洲999一在线观看www| 国产一区二区三区在线| 韩国精品久久久999| 成人激情电影一区二区| 久久成人在线视频| 国产精品视频网址| 亚洲国产精品专区久久| 日韩av成人在线观看| 亚洲精品免费网站| 欧美乱大交做爰xxxⅹ性3| 好吊成人免视频| 91国自产精品中文字幕亚洲| 亚洲伊人一本大道中文字幕| 黑人精品xxx一区| 欧美成人精品一区二区| 成人xxxxx| 久久久久久久久综合| 成人亲热视频网站| 欧美精品久久久久久久久久| 亚洲va久久久噜噜噜久久天堂| 亚洲成人黄色网址| 欧美精品一区在线播放| 日韩中文字幕在线观看| 亚洲美女在线视频| 亚洲天堂免费在线| 日韩高清免费在线| 久久婷婷国产麻豆91天堂| 日韩欧美精品免费在线| 人人做人人澡人人爽欧美| 亚洲成人在线网| 欧美成人h版在线观看| 国产精品户外野外| www.日韩av.com| 欧美精品18videosex性欧美| 精品国产精品自拍| 国产精品美女免费| 久久久久亚洲精品| 狠狠干狠狠久久| 欧美日韩综合视频网址| 欧美激情按摩在线| 欧美日韩美女视频| 97国产精品视频| 亚洲第一av网| 久久久久中文字幕| 欧美高清在线观看| 欧美成人精品一区二区三区| 欧美日韩亚洲视频一区| 亚洲人成在线观看网站高清| 亚洲第一av网| 精品人伦一区二区三区蜜桃免费| 精品视频一区在线视频| 国产精品一久久香蕉国产线看观看| 国产男人精品视频| 亚洲精品成人网| 精品久久久久久久久久久久久| 欧美成人精品影院| 高清欧美一区二区三区| 成人情趣片在线观看免费| 亚洲欧美日韩中文在线制服| 国产a∨精品一区二区三区不卡| 欧美成人精品不卡视频在线观看| 久久综合免费视频影院| 97在线免费视频| 精品久久久久久久久久| 欧美在线免费看| 中国china体内裑精亚洲片| 欧美电影免费在线观看| 国产一区二区三区日韩欧美| 国产成人精彩在线视频九色| 久久精品成人欧美大片古装| 亚洲综合自拍一区| 久久久久久亚洲精品不卡| 国产一区二区三区在线观看视频| 国产日韩欧美电影在线观看| 国产精品久久久久免费a∨大胸| 欧美黄色片视频| 成人免费在线视频网址| 国产免费亚洲高清| 欧美理论电影网| 亚洲免费成人av电影| 久久久久久久久久久网站| 一区二区三区黄色| 精品视频在线观看日韩| 日韩在线观看你懂的| 午夜精品在线观看| 91精品视频网站| 亚洲自拍欧美色图| 欧美中文字幕精品| 精品久久久一区二区| 国内精品美女av在线播放| 日韩中文字幕视频| 一夜七次郎国产精品亚洲| 91免费看片网站| 在线亚洲午夜片av大片|