【问题标题】:Javascript object literal & "this" context? [duplicate]Javascript对象文字和“this”上下文? [复制]
【发布时间】:2012-12-01 20:37:24
【问题描述】:

可能重复:
Javascript: Object Literal reference in own key’s function instead of ‘this’

我有这个简单的代码:

var myObj = {
    init: function ()
    {
        this.Name = "Royi";
        this.BindMe();
    }
    BindMe: function ()
    {
        $('myButton').on("click", this.Work);
    },
    Work: function ()
    {
        var self = this; <--------
    }
}

跑步:

myObj.init();

这是一个简单的对象字面量。 问题出在Work 方法上。我想让它知道this (myObj)

有两种方法:

选项 #1

BindMe中,点击时,通过:传递上下文:

$('myButton').on("click",{self:this}, this.Work);

Work 做:

var self = e.data.self... //还要加上e

选项 #2

var self = myObj ;

问题

  • 还有其他方法吗?

  • 哪种方式更好/正确?

【问题讨论】:

  • 不使用对象字面量是一种选择吗?
  • @Bergi 我已经看到了这个问题。它没有提供答案。 (针对我的具体问题)。
  • @AndrewWhitaker 不。我想在文字对象中学习这种行为。

标签: javascript scope this


【解决方案1】:

不要将它作为数据添加到事件对象中。相反,请使用 .bind() 或 jQuery-ish(跨浏览器)proxy 为函数提供正确的 thisArg(参见 MDN 的 introduction to the this keyword):

$('myButton').on("click", $.proxy(this, "Work"));

【讨论】:

  • $.proxyFunction#bind有什么区别?
  • 在我看来$.proxy(f,t)f.bind(t) 相同。我说的对吗?
  • 不错的解决方案。 (附言这个答案不是关于重复的问题仅供参考)。但同样,关于我的第二个选项,这样做可以吗?
  • @RoyiNamir:是的,当然,但是如果你想静态引用myObj,为什么还要将它绑定到局部变量self?看看the possible duplicate 是否是一个好的解决方案。
【解决方案2】:

您可以将上下文作为闭包的一部分传递给处理函数:

$('myButton').on("click", (function(context) {
    return function() {
        context.Work
    };
})(this));

不用说,这是跨浏览器,因为它依赖于 JS 的核心特性之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多