第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

請(qǐng)問(wèn)這里的this指什么?

http://img1.sycdn.imooc.com//59b78f40000101c603830061.jpg

我已經(jīng)理解了next("左運(yùn)動(dòng)參數(shù)")(馬車開(kāi)始向左運(yùn)動(dòng)).then("轉(zhuǎn)向參數(shù)")(馬車轉(zhuǎn)向).then("右運(yùn)動(dòng)參數(shù)")(馬車開(kāi)始向右運(yùn)動(dòng)).then()(馬車停止)這種方式。

  1. 請(qǐng)問(wèn)這里的1,2,3號(hào)this分別指的是什么?

  2. 這里的邏輯怎么樣的?如果讓我寫(xiě),我怎么知道這樣去寫(xiě),因?yàn)檫@里很不符合初學(xué)者思維習(xí)慣。

http://img1.sycdn.imooc.com//59b790a40001874e03590040.jpg

  1. 這里的callback干什么用?

http://img1.sycdn.imooc.com//59b790c300010c0e02000021.jpg

  1. 這里的this為什么要存到that去?

  2. 如果不用that保存this,那么this的引用會(huì)在哪被更改?



正在回答

4 回答

2樓說(shuō)的不錯(cuò).

我補(bǔ)充幾點(diǎn)


先說(shuō)下apply()函數(shù)

var?add?=?function(a,b){
????return?a?+?b;
}
var?sub?=?function(a,b){
????return?a?-?b;
}

var?result?=?add.apply(sub,[8,1]);
var?result_1?=?sub.apply(add,[8,1]);
console.log(result);?//?9
console.log(result_1);?//?7

apply()是函數(shù)對(duì)象的一個(gè)方法,
它的作用是改變函數(shù)的調(diào)用對(duì)象,
它的第一個(gè)參數(shù)就表示改變后的調(diào)用這個(gè)函數(shù)的對(duì)象。

而第一個(gè)和第二個(gè)this是指向globalwindow對(duì)象

第三個(gè)this指向的是使用new調(diào)用構(gòu)造函數(shù)pageA 實(shí)例化的對(duì)象

關(guān)于 this 關(guān)鍵字 參考此鏈接

http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascript.html


我們分析一下var next = function(){...}這個(gè)函數(shù)

var?next?=?function(){
???return?this.next.apply(this,arguments);
}.bind(this)


?第一個(gè)和第二個(gè)thisnext()函數(shù)的內(nèi)部

而第三個(gè)this不在next()的內(nèi)部,而是屬于pageA.prototype.run = function(callback){...}這個(gè)函數(shù)內(nèi)部了.

next()函數(shù)是全局對(duì)象global或window的方法,所以在next()函數(shù)內(nèi)部的this就是指向他們了

pageA.prototype.run = function(callback){...}這個(gè)函數(shù)內(nèi)部的this是如下傳遞過(guò)來(lái)的

new?pageA($pageA);
function?pageA?(element)?{
????//?this?指向pageA的實(shí)例對(duì)象
????//根元素
????this.$root?=?element;
????//小男孩
????this.$boy?=?element.find(".chs-boy");
????//?執(zhí)行pageA的實(shí)例對(duì)象的run方法
????this.run();
}

如果我們給這個(gè)實(shí)例對(duì)象命個(gè)名

var?something?=?new?pageA($pageA);

那么第三個(gè)this就是由

this.run(); 傳遞過(guò)來(lái)的something對(duì)象了


我們?cè)倏?em>bind()函數(shù)

function?add(a,b){????
????return?a?+?b;
}
var?a?=?3;
var?b?=?4;
var?newFoo?=?add.bind(this,a,?b);?
a?=?6;
b?=?7;
console.log(newFoo());??//?7
console.log(this.a);??//?6
console.log(this.b);?//?7

由此,我們可以得出結(jié)論

bind()函數(shù) 綁定的是參數(shù)的值,而不是實(shí)際變量的值。


再看這個(gè)例子

this.num?=?9;?

var?module?=?{??
num:?81,?
getNum:?function()?{?return?this.num;}
}

?
module.getNum();?//?81

var?getNum?=?module.getNum;
getNum();?//?9,?因?yàn)樵谶@個(gè)例子中,"this"指向全局對(duì)象

//?創(chuàng)建一個(gè)'this'綁定到module的函數(shù)
var?boundGetNum?=?getNum.bind(module);

boundGetNum();??//?81

由此,我們可以得出結(jié)論

bind()函數(shù) 改變了this的指向



綜上

我們完全可以這樣寫(xiě)

//?給pageA添加run方法
pageA.prototype.run?=?function(){

????//?存儲(chǔ)當(dāng)前上下文對(duì)象:?pageA的實(shí)例對(duì)象
????var?that?=?this;
????
????//?定義next方法?注意:此處不是pageA的next方法
????//?而是是pageA的run方法里面的next方法.
????var?next?=?function(){
????????return?this.next.apply(this,arguments)
????????//?注意?這里不寫(xiě)this?寫(xiě)的是that?意圖更明顯
????}.bind(that)
????
????//?這里調(diào)用的就是上面聲明的next方法
????//?注意?上面用var聲明的next()是沒(méi)有定義參數(shù)的
????//?但是用了?arguments?這個(gè)關(guān)鍵字取得了傳入的參數(shù)
????next({
????????"time":?10000,
????????"style":?{
????????????"top":?"4rem",
????????????"right":?"16rem",
????????????"scale":?"1.2"
????????}
????})
????.then(function()?{
???????return?next({
????????????"time":500,
????????????"style":?{
???????????????"rotateY"?:?"-180",
???????????????"scale":?"1.5"
????????????}
????????})
????})????
????.then(function()?{
????????return?next({
????????????"time":?7000,
????????????"style":?{
????????????????"top"???:"7.8rem",
????????????????"right"?:?"1.2rem"
????????????}
????????})
????})
????.then(function(){
????????that.stopWalk();
????})??
}

目前的情況也可以這樣寫(xiě)

?//?給pageA添加run方法
pageA.prototype.run?=?function(){
????this.next({
????????"time":?10000,
????????"style":?{
????????????"top":?"4rem",
????????????"right":?"16rem",
????????????"scale":?"1.2"
????????}
????})
????.then(function()?{
???????return?this.next({
????????????"time":500,
????????????"style":?{
???????????????"rotateY"?:?"-180",
???????????????"scale":?"1.5"
????????????}
????????})
????})????
????.then(function()?{
????????return?this.next({
????????????"time":?7000,
????????????"style":?{
????????????????"top"???:"7.8rem",
????????????????"right"?:?"1.2rem"
????????????}
????????})
????})
????.then(function(){
????//?注意:?此處不再是that
????????this.stopWalk();
????})??
}





0 回復(fù) 有任何疑惑可以回復(fù)我~
#1

superhuman進(jìn)化中 提問(wèn)者

非常感謝!
2018-02-01 回復(fù) 有任何疑惑可以回復(fù)我~

再補(bǔ)充一下....

突然發(fā)現(xiàn)有一點(diǎn)沒(méi)說(shuō)

就是為什么要多此一舉聲明另一個(gè)next()函數(shù),然后用apply()和bind()函數(shù)來(lái)將對(duì)象轉(zhuǎn)移呢?

我猜測(cè)啊,應(yīng)該是避免異步導(dǎo)致的參數(shù)賦值混亂.我猜的哈

總之這樣寫(xiě)應(yīng)該是有其作用的

因?yàn)槲衣?tīng)說(shuō)過(guò)一句話:任何編程方面的問(wèn)題,都可以通過(guò)添加一個(gè)中間件的方式得到解決.



0 回復(fù) 有任何疑惑可以回復(fù)我~

再補(bǔ)充一下 callback 是回調(diào)函數(shù) 目前沒(méi)用? 刪掉也沒(méi)關(guān)系

下節(jié)應(yīng)該會(huì)用到

0 回復(fù) 有任何疑惑可以回復(fù)我~

第三個(gè)this指向的是構(gòu)造函數(shù)pageA new出的對(duì)象,也就是對(duì)象本身。

第一個(gè)和第二個(gè)this本應(yīng)指向window,但被bind改變了指向,所以也指向?qū)ο蟊旧怼?/p>

0 回復(fù) 有任何疑惑可以回復(fù)我~

舉報(bào)

0/150
提交
取消
H5+JS+CSS3 實(shí)現(xiàn)圣誕情緣
  • 參與學(xué)習(xí)       122125    人
  • 解答問(wèn)題       233    個(gè)

為圣誕節(jié)準(zhǔn)備的H5+JS+CSS特效案例教程,實(shí)現(xiàn)靜與動(dòng)的結(jié)合

進(jìn)入課程

請(qǐng)問(wèn)這里的this指什么?

我要回答 關(guān)注問(wèn)題
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)