为了账号安全,请及时绑定邮箱和手机立即绑定

javascript中this什么时候可以直接调用?什么时候要把它赋值给一个变量后才能调用?

javascript中this什么时候可以直接调用?什么时候要把它赋值给一个变量后才能调用?

鱼飞跃月 2016-03-19 23:56:06
查看完整描述

2 回答

已采纳
?
qff

TA贡献5条经验 获得超4个赞

this使用注意点

1) 避免多层this

var o = {  

     f1: function() {    

         console.log(this);      

        var f2 = function() {      

             console.log(this);    

         }();   

        }     

o.f1()

上面代码包含两层this,结果运行后,第一层指向该对象,第二层指向全局对象。一个解决方法是在第二层改用一个指向外层this的变量。

var o = {   

    f1: function() {     

        console.log(this);      

        var that = this;     

        var f2 = function() {       

            console.log(that);     

        }();   

    } 

o.f1()

上面代码定义了变量that,固定指向外层的this,然后在内层使用that,就不会发生this指向的改变。

2) 避免数组处理方法中的this

数组的map和foreach方法,允许提供一个函数作为参数。这个函数内部不应该使用this。

var o = {
 v: 'hello',
 p: [ 'a1', 'a2' ],
 f: function f() {
   this.p.forEach(function (item) {
     console.log(this.v+' '+item);
   });
 }}

o.f()

上面代码中,foreach方法的参数函数中的this,其实是指向window对象,因此取不到o.v的值。

解决这个问题的一种方法,是使用中间变量。

var o = {
 v: 'hello',
 p: [ 'a1', 'a2' ],
 f: function f() {
   var that = this;
   this.p.forEach(function (item) {
     console.log(that.v+' '+item);
   });
 }}

o.f()

另一种方法是将this当作foreach方法的第二个参数,固定它的运行环境。

var o = {
 v: 'hello',
 p: [ 'a1', 'a2' ],
 f: function f() {
   this.p.forEach(function (item) {
     console.log(this.v+' '+item);
   }, this);
 }}

o.f()

2) 避免回调中的this

var o = new Object();o.f = function (){
 console.log(this === o);}o.f()

上面代码表示,如果调用o对象的f方法,其中的this就是指向o对象。

但是,如果将f方法指定给某个按钮的click事件,this的指向就变了。

$('#button').on('click', o.f);


查看完整回答
1 反对 回复 2016-03-24
?
Caballarii

TA贡献1123条经验 获得超629个赞

this在对象调用的时候指代的对象会变,所以使用的时候最好是先赋值给一个变量,保证使用this的时候还是你想要使用的那个对象

查看完整回答
反对 回复 2016-03-23
  • 2 回答
  • 0 关注
  • 1691 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信