【问题标题】:How to call a function of the caller's namespace with this?如何用 this 调用调用者命名空间的函数?
【发布时间】:2011-08-23 02:41:28
【问题描述】:

目标:我试图通过使用“this”而不是命名空间字符串来缩短在函数中调用同一命名空间的函数的方式。但显然“this”不适用于函数,它只适用于变量。我想知道这是否是由于我的误用,或者使用命名空间字符串调用函数是唯一的方法。

另一个初学者的问题:我正在调用与调用者相同命名空间的函数。我用谷歌搜索,有人打电话说:this.myfunction 可以工作,但不能。有任何想法吗?谢谢。

我打电话给: singleEntry.editContent.accept(tinyMCE.get('editContentTa').getContent());

来自: index.fragment.singleEntry.editContent.load

我试过这样做:this.accept,但萤火虫说 this.accept 不是一个函数...

  index.fragment.singleEntry.editContent.load = (function(singleEntry) {
return function() {
    // prepare edit dialog
    $("#editContentDiv").dialog({
        autoOpen : false,
        height : 500,
        width : 600,
        modal : true,
        buttons : {
            "OK" : function() {
                singleEntry.editContent.accept(tinyMCE.get('editContentTa').getContent());
                $(this).dialog("close");
            },
            "CANCEL" : function() {
                $(this).dialog("close");
            }
        },
        open : function() {
            // set value to the edit area
            tinyMCE.get("editContentTa").setContent($("#veContent").html());
        }
    });

【问题讨论】:

  • 我已经验证,对于一个变量, this.variableName 可以工作。但是对于一个函数它没有。

标签: jquery function namespaces


【解决方案1】:

我并没有完全追随你的最终目标,所以一些理论希望它可以帮助你实现目标:

当您通过对象的属性调用函数时(因此,通过点表示法或[] 表示法),函数调用中的this 将是对象引用。所以当你打电话时

singleEntry.editContent.accept(tinyMCE.get('editContentTa').getContent());

...在该调用中,this 将引用 singleEntry.editContent

如果你想让this 引用别的东西,你可以使用call

singleEntry.editContent.accept.call(thisObj, tinyMCE.get('editContentTa').getContent());
//                            ^^^^^^^^^^^^^

...其中thisObj 是您希望函数在调用期间将其视为this 的任何对象。更多信息:Mythical methods

call 是所有(真正的)JavaScript 函数的属性,并且专门提供以方便调用函数并设置 this 应该是什么(context 是什么)通话期间。还有apply,它做同样的事情,但接受作为数组而不是离散参数传递给函数的参数。例如,这两个调用是相同的:

// Using `call`
singleEntry.editContent.accept.call(thisObj, tinyMCE.get('editContentTa').getContent());

// Using `apply`
singleEntry.editContent.accept.call(thisObj, [tinyMCE.get('editContentTa').getContent()]);
//                        Note the `[]` -----^

所有这一切都成为可能,因为在 JavaScript 中,this 完全由函数的调用方式决定,而不是在哪里定义——我想你知道,基于您的问题,但无论如何都值得举报。

【讨论】:

  • 谢谢,TJ。克劳德。但是我正在尝试缩短调用同一命名空间的函数的方式...
  • "所有这一切都是可能的,因为在 JavaScript 中,这完全取决于函数的调用方式,而不是函数的定义位置——我想你知道,根据你的问题,但值得标记反正。”好点子。这是我第一次知道这件事。 :D
  • @Issac:JavaScript 没有名称空间,只有对象(呃和范围)。恐怕我只是没有遵循你的最终目标。你想成为什么对象this,为什么? (并且:很高兴我包含了那个注释!我不完全确定,它与其他语言有很大不同,我试图向人们强调它。)
  • 再次感谢您的回复! :) 我的目标是:我试图通过使用“this”而不是命名空间字符串来缩短我在函数中调用同一命名空间的函数的方式。但显然“this”不适用于函数,它只适用于变量。我想知道这是否是由于我的误用,或者使用命名空间字符串调用函数是唯一的方法。
  • @Issac:this.variableName 不是指变量,而是指属性。附加到对象的函数也只是属性值,因此在这个意义上它们之间没有区别。如果您的目标只是缩短对该函数的引用,那没问题:var x = singleEntry.editContent; x.accept(...); 再说一次,JavaScript 没有命名空间,因此您可能会在使用该术语时感到困惑......
猜你喜欢
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 2016-01-10
相关资源
最近更新 更多