在Coldfusion中等效于JavaScript的call()和apply()函数

时间:2012-02-02 04:37:15

标签: javascript coldfusion

我需要在Coldfusion 8中实现与JavaScript的call()或apply()函数类似的功能。我需要一种方法来动态绑定我调用的函数的'this'上下文。如果没有手动传递参数列表中的上下文,还有其他方法可以做到这一点吗?不幸的是,我很难在Google上搜索线索,因为我似乎无法搜索关键字“this”。

<!--- component A --->
<cfcomponent>
    <cffunction name="init">
        <cfset this.value = "My name is A">
        <cfreturn this>
    </cffunction>

    <cffunction name="setDelegate">
        <cfargument name="delegate">

        <cfset this.delegate = delegate>
    </cffunction>

    <cffunction name="runDelegate">
        <cfoutput>#this.delegate()#</cfoutput>
    </cffunction>
</cfcomponent>

<!--- component B --->
<cfcomponent>
    <cffunction name="init">
        <cfset this.value = "Hello, I am B">
        <cfreturn this>
    </cffunction>

    <cffunction name="call">
        <cfoutput>#this.value#</cfoutput>
    </cffunction>
</cfcomponent>

<!--- main cfm --->
<cfset mrA = createObject('component', 'A').init()>
<cfset mrB = createObject('component', 'B').init()>

<cfset mrA.setDelegate(mrB.call)>

<!--- I want to return "Hello, I am B", --->
<!--- but it's going to output "My name is A" in this case --->
<cfoutput>#mrA.runDelegate()#</cfoutput>

在上面的示例中,'this'上下文属于A,但我想将上下文绑定到B以使用B的属性。

通过简单地将mrB传入call()函数,在JavaScript中很容易做到: mrA.runDelegate.call(MRB);这会将'this'上下文设置为mrB而不是mrA。

3 个答案:

答案 0 :(得分:1)

假设您尝试从给定组件中动态调用方法,则可能需要执行类似

的操作
<cfinvoke component="#this#" method="#methodToCall#">
   <cfinvokeargument name="#prop#" value="#someValue#" />
</cfinvoke>

那将使用整个“this”并调用组件中的方法,因此您的上下文应该完好无损。

如果您只是以标准方式调用组件中的方法,则可以使用“this”而不做任何特殊操作。

为了给你一个更好的解决方案,我们需要知道你想要达到的目标。

答案 1 :(得分:0)

我实际上并不认为这是可能的,因为此范围是CFC实例的公共范围,替换此上下文并非易事。但是,正如@ rip747建议的那样,如果你对自己的目标更加清楚,也许有办法可以做到。

答案 2 :(得分:0)

对不起,我想我已经明白了。我也应该和代表一起传递上下文来打电话。当我想到我是如何用JavaScript做的时候,我突然意识到我错过了一个论点。

<!--- Component A --->
<cfcomponent>
    <cffunction name="init"> 
        <cfset this.value = "My name is A">
        <cfreturn this>
    </cffunction>

    <cffunction name="setDelegate">
        <cfargument name="delegate">
        <cfargument name="context">

        <cfset this.delegate = delegate>
        <cfset this.context = context>
    </cffunction>

    <cffunction name="runDelegate">
        <cfoutput>#this.delegate()#</cfoutput>
    </cffunction>
</cfcomponent>

<!--- component B --->
<cfcomponent>
    <cffunction name="init">
        <cfset this.value = "Hello, I am B">
        <cfreturn this>
    </cffunction>

    <cffunction name="call">
        <cfoutput>#this.value#</cfoutput>
    </cffunction>
</cfcomponent>

<!--- main cfm --->
<cfset mrA = createObject('component', 'A').init()>
<cfset mrB = createObject('component', 'B').init()>

<cfset mrA.setDelegate("call", mrB)>

<cfoutput>
    <cfinvoke component="#mrA.context#" method="#mrA.delegate#"></cfinvoke>
</cfoutput>