未定义backbonejs函数[重复]

dwthyt8l  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(165)

此问题在此处已有答案

How does the "this" keyword work, and when should it be used?(22个答案)
四年前就关门了。
我遇到了一个未定义的函数。
我获取键值对并在forEach上执行函数。
该结构

var AppView = Backbone.View.extend({
  initialize: function() {
    this.render();
  },
  render: function() {
    this.$el.html("Hello World");
    this.one();
  },
  one: function() {
    this.two();
  },
  two: function() {
    var object = {
      "labname4": "423",
      "Path": "4",
      "X": "4"
    };
    console.log('two');

    Object.keys(object).map(function(objectKey, index) {
      var value = object[objectKey];
      this.three();
    });
  },
  three: function() {
    console.log('three');
  },
});

var appView = new AppView();
console.log("done");

使用:

  • jquery/1.7.2中的查询
  • underscore.js/1.3.3
  • backbone.js/0.9.2
mzsu5hc0

mzsu5hc01#

因为当你调用Object.keys(object).map的时候改变了作用域,所以你不能用它来访问原来的值。把它的别名改为that,你仍然可以访问它的原来的值。你的代码看起来像这样。

var AppView = Backbone.View.extend({

  initialize: function(){
    this.render();
  },
  render: function(){
    this.$el.html("Hello World");
    this.one();
  },

  one: function(){
  this.two();
  },
  two: function(){
  var that = this;
  var object = { "labname4": "423",
                "Path": "4",
                "X": "4"};
    console.log('two');

    Object.keys(object).map(function(objectKey, index) {
        var value = object[objectKey];
        that.three();
    });

  },
  three: function(){
    console.log('three');
  },
});
var appView = new AppView();
console.log("done");

编辑1= this与绑定的变量

在我看来,.bind确实有它的位置,例如,当你在变量中有一个函数,你想把它附加到一个特定的this上。
也就是说,在嵌套匿名函数的情况下,我认为使用var that = this;与使用. bind相比,使用. bind更简单明了,需要更少的心理准备。例如,假设我们有两个嵌套函数:

function foo() {
  return (function() {
    doSomething((function() {
      return this.name; // what is `this` again?
    }).bind(this));
  }).bind(this);
}

function foo() {
  var that = this;
  return (function() {
    doSomething((function() {
      return that.name; // `that` is easy to know because its defined 
    })
  })
}

当然,因为这是一个风格问题,所以“心理账户”的问题因人而异。但对我来说,考虑到Javascript的this的语义,我认为当你有嵌套回调时,that = this很容易理解。

wgxvkvu9

wgxvkvu92#

这是使用嵌套函数时的常见错误,例如:

Object.keys(object).map(function(objectKey, index) {
            var value = object[objectKey];
            this.three();
        });

这里this.three()this不再引用你的对象,因为它在一个嵌套函数范围内,并且方法three()没有在它上面定义。
有两种可能的解决方案:
a)使用clojure代替嵌套函数。您可以编写相同的代码,如下所示:

Object.keys(object).map((objectKey, index) => { // note the arrow and no 'function' keyword
            var value = object[objectKey];
            this.three();
        });

clojure保持在当前作用域中,因此this.three()将工作,另一方面,function定义了它自己的作用域。
B)如果您希望function在特定范围内执行,则可以绑定function,例如:

Object.keys(object).map(function(objectKey, index) {
            var value = object[objectKey];
            this.three();
        }.bind(this)); // note '.bind(this)'

这样function将使用你当前的作用域而不是创建一个新的作用域。这两种方法都有效,由用户选择一个,我个人更喜欢clojures

相关问题