【问题标题】:this in javascript这个在javascript中
【发布时间】:2011-10-31 06:31:17
【问题描述】:

我在 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
  }
}

【问题讨论】:

  • 您必须向我们展示调用方法的代码 - 因为this 依赖于调用,它可能会产生影响。另外,this.data() 是什么?除了data 参数之外,您没有名为data 的函数。 data 是函数吗?
  • 函数的 this 关键字的值完全取决于它的调用方式。阅读'this' keyword, not clear的答案。
  • 你真的需要this.get_data()吗?你不能打电话给this.data吗?这似乎是你在 Java/C++ 中会做的事情,其中​​一些属性是私有的。

标签: javascript


【解决方案1】:

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

如果你打电话

item = new Feed_Item()
item.foo() //foo will be called with correct 'this'

但是,如果您执行 Feed_Item(some_data),您将向全局窗口对象添加几个函数。

有很多文章解释了这个,例如http://www.digital-web.com/articles/scope_in_javascript/

【讨论】:

    【解决方案2】:

    这里有一篇很好的解释“这个”的博文:http://www.scottlogic.co.uk/2010/05/what-is-this/

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

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

        window.str = "hello";
        var fn = function(){
          alert(this.str);
        };
        fn();
    

    在浏览器控制台中运行此代码会得到hello,它是全局window 对象上str 的值,但是如果您运行:

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

    您会得到“再见”,因为上下文已更改为传入的对象。一些库,例如JQuery, ExtJS, ...利用这个特性使之更易于使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 2015-05-04
      • 2013-04-29
      • 2013-04-11
      • 2019-02-17
      • 1970-01-01
      相关资源
      最近更新 更多