亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

javascript運行上下文 問題

javascript運行上下文 問題

胡子哥哥 2019-04-14 11:28:42
varelement=document.getElementById('element');varuser={firstname:'Wilson',greeting:function(){alert('Mynameis'+this.firstname);}};//Attachuser.greetingasacallbackelement.addEventListener('click',user.greeting);//alert=>'Mynameisundefined'為什么運行的時候,拿不到上下文的值firstname的值
查看完整描述

2 回答

?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

這不是上下文件的問題,是this的問題。
像下面這么改下就對了:
element.addEventListener('click',user.greeting.bind(user));
                            
查看完整回答
反對 回復 2019-04-14
?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

問題是怎么出現的JS中的this只與函數調用方式有關,與定義時的上下文,函數作用域,都無關。有如下情況:user.greeting()//this-->uservarhandler=user.greeting;handler()//this-->window當程序執行到element.addEventListener('click',user.greeting);user.greeting作為addEventListener的第二個參數,假設這個參數就叫handler??梢韵胂螅赼ddEventListener的內部,進行了類似varhandler=user.greeting;//這步在傳遞參數時完成handler()//this-->window的過程,this的指向就發生了改變。如何修復this的指向只與函數調用方式有關,函數調用方式一共四種:func();obj.func();func.apply/call();newfunc();要修復這個問題,需要用到apply/call這種調用方式。我們可以想象bind是這樣一個函數:functionbind(func,target){returnfunction(){func.apply(target,arguments);}}Function.prototype['bind']=function(target){returnbind(this,target);}這樣,就可以使用element.addEventListener('click',user.greeting.bind(user));來解決這個問題了。當然,這里的bind是非常簡化、不可用的,比如可以看到bindreturn的函數已經不是原函數了,為了保持一致性應該綁定原型鏈。這一系列完整的操作在MDN文檔中都可以看到。
查看完整回答
反對 回復 2019-04-14
  • 2 回答
  • 0 關注
  • 324 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號