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

為了賬號安全,請及時綁定郵箱和手機立即綁定

請問這里的this指什么?

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

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

  1. 請問這里的1,2,3號this分別指的是什么?

  2. 這里的邏輯怎么樣的?如果讓我寫,我怎么知道這樣去寫,因為這里很不符合初學者思維習慣。

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

  1. 這里的callback干什么用?

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

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

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



正在回答

4 回答

2樓說的不錯.

我補充幾點


先說下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ù)對象的一個方法,
它的作用是改變函數(shù)的調(diào)用對象,
它的第一個參數(shù)就表示改變后的調(diào)用這個函數(shù)的對象。

而第一個和第二個this是指向globalwindow對象

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

關于 this 關鍵字 參考此鏈接

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


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

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


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

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

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

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

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

如果我們給這個實例對象命個名

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

那么第三個this就是由

this.run(); 傳遞過來的something對象了


我們再看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

由此,我們可以得出結論

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


再看這個例子

this.num?=?9;?

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

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

var?getNum?=?module.getNum;
getNum();?//?9,?因為在這個例子中,"this"指向全局對象

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

boundGetNum();??//?81

由此,我們可以得出結論

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



綜上

我們完全可以這樣寫

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

????//?存儲當前上下文對象:?pageA的實例對象
????var?that?=?this;
????
????//?定義next方法?注意:此處不是pageA的next方法
????//?而是是pageA的run方法里面的next方法.
????var?next?=?function(){
????????return?this.next.apply(this,arguments)
????????//?注意?這里不寫this?寫的是that?意圖更明顯
????}.bind(that)
????
????//?這里調(diào)用的就是上面聲明的next方法
????//?注意?上面用var聲明的next()是沒有定義參數(shù)的
????//?但是用了?arguments?這個關鍵字取得了傳入的參數(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();
????})??
}

目前的情況也可以這樣寫

?//?給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 回復 有任何疑惑可以回復我~
#1

superhuman進化中 提問者

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

再補充一下....

突然發(fā)現(xiàn)有一點沒說

就是為什么要多此一舉聲明另一個next()函數(shù),然后用apply()和bind()函數(shù)來將對象轉移呢?

我猜測啊,應該是避免異步導致的參數(shù)賦值混亂.我猜的哈

總之這樣寫應該是有其作用的

因為我聽說過一句話:任何編程方面的問題,都可以通過添加一個中間件的方式得到解決.



0 回復 有任何疑惑可以回復我~

再補充一下 callback 是回調(diào)函數(shù) 目前沒用? 刪掉也沒關系

下節(jié)應該會用到

0 回復 有任何疑惑可以回復我~

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

第一個和第二個this本應指向window,但被bind改變了指向,所以也指向對象本身。

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

請問這里的this指什么?

我要回答 關注問題
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號