Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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 对象文字中JS作用域中的未定义变量_Javascript - Fatal编程技术网

Javascript 对象文字中JS作用域中的未定义变量

Javascript 对象文字中JS作用域中的未定义变量,javascript,Javascript,我有以下代码: 问题是,我没有定义输出,我想知道如何访问click处理程序中的人 注意:单击处理程序只是我的问题的一个例子,我在另一个上下文中也有它。有一个众所周知的技巧来保留对函数原始范围的引用: init: function() { var self = this; $( '#foo' ).click( function() { console.log( self.person ); } ); }, 基本上,您需要将这个变量缓存到另一个变量中,在本例中称为self。然后

我有以下代码:

问题是,我没有定义输出,我想知道如何访问click处理程序中的人


注意:单击处理程序只是我的问题的一个例子,我在另一个上下文中也有它。

有一个众所周知的技巧来保留对函数原始范围的引用:

init: function() {
  var self = this;
  $( '#foo' ).click( function() {
    console.log( self.person );
  } );
},
基本上,您需要将这个变量缓存到另一个变量中,在本例中称为self。然后,在click处理程序内部,您可以访问self变量,就像它是click处理程序外部的this变量一样

另一种选择是简单地使用主干网的事件委派:

var test = {

  events: {
    "click #foo": "foo_click_handler"
  }

  person: "nick",

  foo_click_handler: function() {
      // callback is bound to the view scope, so "this" can be used normally.
      console.log( this.person );
  },

};
发件人:

所有附加的回调在传递给jQuery之前都会绑定到视图,因此当调用回调时,它会继续引用视图对象


这是因为在单击处理程序中,这实际上是指触发事件的控件

我已经更新了你的代码,它是有效的。这是你需要做的

var test = {
  person: "nick",

  init: function() {
    var obj = this;
    $('#foo').click(function() {
      // how to access the person? 
      alert("inside");
      console.log(obj.person);
    });
  },

};


test.init();
而不是使用var self=this;例如,保存对您的对象的引用,或者保存JavaScript标准库中包含的我将使用的其他事件库,这将使您的代码更加简洁,模块化程度更高

bind所做的是将函数logperson绑定到您传递它的任何对象上,在本例中

这确实使您不再使用匿名函数,但是出于我个人的偏好,匿名函数总是更好

var logperson = function() {
    console.log(this.person);
};

var test = {
    person: "nick",

    init: function() {

        $('#foo').click(logperson.bind(this));

    };
 };
var logperson = function() {
    console.log(this.person);
};

var test = {
    person: "nick",

    init: function() {

        $('#foo').click(logperson.bind(this));

    };
 };