这是用javascript编写的

这是用javascript编写的,javascript,Javascript,我在javascript中使用“this”时遇到了一个令人困惑的问题。我有一个“get_data”方法,它返回一个对象的某个成员变量。有时它会把物体本身还给我。。。我不知道为什么。有人能解释一下这里发生了什么吗 function Feed_Item(data) { this.data = data; this.get_data = function() { return this.data; } this.foo = function() { return th

我在javascript中使用“this”时遇到了一个令人困惑的问题。我有一个“get_data”方法,它返回一个对象的某个成员变量。有时它会把物体本身还给我。。。我不知道为什么。有人能解释一下这里发生了什么吗

function Feed_Item(data) {
  this.data = data;
  this.get_data = function() {
    return this.data;
  }

  this.foo = function() {
    return this.foo2();
  }
  this.foo2 = function() {
    //here type of this.data() == Feed_Item!!! It should be of type Data
  }
  this.bar = function() {
    //here type of this.data() == Data, as I'd expect
  }
}

JavaScript中的“this”取决于调用函数的方式。如果“this”未绑定到对象,则它将是窗口对象

如果你打电话

item = new Feed_Item()
item.foo() //foo will be called with correct 'this'
但是,如果您确实提供了_项(一些_数据),那么您将向全局窗口对象添加几个函数


有很多文章对此进行了解释,例如,

JavaScript中的“this”是什么取决于调用函数的方式。如果“this”未绑定到对象,则它将是窗口对象

如果你打电话

item = new Feed_Item()
item.foo() //foo will be called with correct 'this'
但是,如果您确实提供了_项(一些_数据),那么您将向全局窗口对象添加几个函数


有很多文章解释了这一点,例如,

这里有一篇解释“这一点”的好博文:

本质上,该的定义是: 该值在调用函数时确定,并设置为调用函数的对象

然而,有时要弄清楚那个物体到底是什么并不容易。这是因为它取决于函数的调用方式。您甚至可以通过调用函数的
call
方法来动态设置该函数的值,例如

    window.str = "hello";
    var fn = function(){
      alert(this.str);
    };
    fn();
在浏览器控制台中运行此代码会得到
hello
,这是全局
窗口
对象上
str
的值,但是如果运行:

   fn.call({
       str: 'goodbye'
   }, []);

您将得到“再见”,因为上下文已更改为传入的对象。一些库,例如JQuery、ExtJS。。。利用此功能使其更易于使用。

这里有一篇解释“这一点”的好博文:

本质上,该
的定义是: 该值在调用函数时确定,并设置为调用函数的对象

然而,有时要弄清楚那个物体到底是什么并不容易。这是因为它取决于函数的调用方式。您甚至可以通过调用函数的
call
方法来动态设置该函数的值,例如

    window.str = "hello";
    var fn = function(){
      alert(this.str);
    };
    fn();
在浏览器控制台中运行此代码会得到
hello
,这是全局
窗口
对象上
str
的值,但是如果运行:

   fn.call({
       str: 'goodbye'
   }, []);

您将得到“再见”,因为上下文已更改为传入的对象。一些库,例如JQuery、ExtJS。。。利用此功能使其更易于使用。

您必须向我们展示调用方法的代码-由于
依赖于调用,因此可能会产生影响。还有,这个.data()是什么?除了
data
参数外,您没有名为
data
的函数。
data
是函数吗?函数的this关键字的值完全取决于它的调用方式。阅读的答案。你真的需要这个。获取数据()
?你不能直接调用这个数据吗?在Java/C++中,某些属性是私有的,这似乎是您应该做的事情。您必须向我们展示调用方法的代码-因为
依赖于调用,它可能会产生影响。还有,这个.data()是什么?除了
data
参数外,您没有名为
data
的函数。
data
是函数吗?函数的this关键字的值完全取决于它的调用方式。阅读的答案。你真的需要这个。获取数据()
?你不能直接调用这个数据吗?在Java/C++中,某些属性是私有的,这似乎是您要做的事情。