Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Backbone.js中的变量范围_Javascript_Backbone.js_Scope - Fatal编程技术网

Javascript Backbone.js中的变量范围

Javascript Backbone.js中的变量范围,javascript,backbone.js,scope,Javascript,Backbone.js,Scope,我在Backbone.js中有一个web应用程序,它使用条带支付系统 这是模型代码的一部分: App.Models.Payment = Backbone.Model.extend({ defaults: { id:null }, url: function() { // code }, initialize:function(){ this.id=''; this.saveClicked= false; this.saveDetailsC

我在Backbone.js中有一个web应用程序,它使用条带支付系统

这是模型代码的一部分:

App.Models.Payment = Backbone.Model.extend({

defaults: {
    id:null
},

url: function() {
    // code
},

initialize:function(){      
    this.id='';
    this.saveClicked= false;
    this.saveDetailsChecked= true;
}
此视图中使用此模型:

App.Views.BillingView = Backbone.View.extend({

el: '#billing-fields',

events: {
    'click #billing-footer-buttons .navigation .confirm-btn': 'saveCardClicked'
},

initialize:function(models, options) {
    Stripe.setPublishableKey('**********************');
    var self = this;
},

saveCardClicked:function(e) {
    e.preventDefault(); 
    if (this.model.saveClicked) return false;
    this.model.saveClicked = true;
    var $form = $('#payment-form');
    Stripe.createToken($form, this.stripeResponseHandler);
},

cancelClicked:function() {
    vent.trigger('showScreen', 'subscribe-container');
},

stripeResponseHandler:function(status, response) {
    var $form = $('#payment-form');
    self.saveDetailsChecked = document.getElementById("billing-checkbox").checked;
    var atr1 = document.getElementById("billing-card-number").value;
    var atr2 = self.model.savedCard;
    if(document.getElementById("billing-card-number").value == self.model.savedCard){
        self.model.set('use_saved_card','1');
        vent.trigger('doPayment');
    }else{
        if (response.error) {
            // code
        } else {
            // code
        }
    }
    self.saveClicked = false;
}
});
在saveCardClicked函数中,我可以访问模型中的变量,就像saveClicked变量一样

但在stripeResponseHandler中,我无法从模型中访问“saveClicked”变量,在该函数中,这指的是窗口,在initialize函数中定义的自变量也无法访问

stripeResponseHandler是从Stripe API调用的

是否有任何方法可以访问stripeResponseHandler函数中的savedCard变量,或者应该使用全局变量?

尝试使用以下方法:-

Stripe.createToken($form, this.stripeResponseHandler.bind(this));

当然,您可以使用
bind

Bind通过将参数绑定到某个函数调用来工作,并将返回一个函数,在调用该函数时,该函数将被传递给调用Bind时声明的参数(加上实际上未声明的任何其他预期参数)。有一个特殊参数要传递给
bind
。第一个,调用函数时将使用
这个
对象

那么,你要做的就是打电话

Stripe.createToken($form, this.stripeResponseHandler.bind(this));
在这里,您声明了一个回调(stripeResponseHandler),当调用它时,它将把
this
作为
this
对象(我知道这个短语很复杂,但我想您已经理解了)

此外,请记住,您的产品线

var self = this;

无法正常工作,因为它的作用域是
初始化
函数,因此在其外部不可见。

我认为需要解释一下。理解一个问题从来都不是一件好事。bind方法将函数绑定到所需的上下文。Stripe.createToken($form,this.stripeResponseHandler)//在条带下调用,通过将其绑定到主干,将其上下文更改为条带,而不是主干。您已将其上下文更改为主干。'工作不正常,其作用域为initialize函数,有没有办法让变量在整个视图中具有作用域?
this.variable=which
将使变量在整个视图中可见。