从回调访问“this”范围变量

Posted

技术标签:

【中文标题】从回调访问“this”范围变量【英文标题】:Accessing 'this' scope variable from callback 【发布时间】:2013-06-12 19:47:08 【问题描述】:

我是 javascript 新手,我对以下代码有疑问。正在尝试从回调中设置价格值,但不起作用...请帮忙?

PreInvoiceSchema.pre('save', function(next) 

//Seperating code from state
var codestate = addr[2].split(/[ ,]+/);
this.customer.zipcode = codestate[2];
this.customer.state = codestate[1];

//Calculating base price
if (this.order_subtype == "Upgrade") 
    this.price = 30;
 else 
    this.price = 50;

var self = this;

for (var j = 0; j < this.work.length; j++) 

    Price.findOne(
        "item": self.work[j].workproduct
    , function(err, val) 
        if (self.work[j] != undefined) 
             self.work[j].workprice = 300; <-- this doesn't work
        
    );
);

【问题讨论】:

j 的值不会一直这样。 【参考方案1】:
for (var j = 0; j < this.work.length; j++) 
    (function(i) 
        Price.findOne(
            "item": self.work[i].workproduct
        , function(err, val) 
            if (self.work[i] != undefined) 
                 self.work[i].workprice = 300; <-- this doesn't work
            
        );
    )(j);
);

【讨论】:

另外,即使您的代码有效,我认为功能性(我的)方式比命令式(您的)方式更优雅。更少的错误空间。 谢谢大家,我试试 'lodash' 方法,但主要问题是在上下文变量上写...,即使我这样做 var self = this,它也没有分配新值到变量... 错字!是的,但是 functional 方式需要一个库,代码行太少,imo 没有必要 :) 我同意。如果你做一两次...... :) 它仍然不起作用:_.each(this.work, function(item) Price.findOne( "item": item.workproduct , function(err, val) console.log(item.workprice); //&lt;--- this is '0' item.workprice = 300; ); ); 当我检查数据库时,this.work[x].workprice 【参考方案2】:

如果我没记错的话,闭包会得到 j 的最后一个值。所以如果迭代从 0 运行到 3,那么你总是有 self.work[3].workprice = 300; (尝试追踪)。

尝试使用库 li lodash 并将您的代码变成如下内容:

_.each(this.work, function(item) 
    Price.findOne(
         "item": item.workproduct , 
        function(err, val) 
            // item.workprice ...
        
    );
);

另外,如果这是真正的代码,那么它在最后一个 ')' 之前缺少一个 ''。

【讨论】:

以上是关于从回调访问“this”范围变量的主要内容,如果未能解决你的问题,请参考以下文章

回调函数无法访问父函数范围内的变量

将范围传递给回调函数/绑定

访问函数内部的变量,使用“this”关键字初始化

是否可以使用接收数据作为参数的函数的闭包范围?

javascript,promise,如何在 then 范围内访问变量 this [重复]

如何从回调函数访问状态[重复]