通过引用执行Javascript函数

时间:2010-02-17 00:56:03

标签: javascript jquery mootools

我想知道是否有任何关于如何通过javascript中的引用执行函数的任何见解。

http://mootools.net/shell/yL93N/1/

任何讨论都会很酷。

-Chase

8 个答案:

答案 0 :(得分:1)

全局定义的函数(和变量)作为全局window对象的成员可见。

可以使用方括号表示法按名称提取对象的成员:o['k']o.k相同。所以,举个例子:

var function_name= $(this).val();
window[function_name]();

答案 1 :(得分:1)

不完全确定你的意思,但你可以这样做:

var func = window.alert;
var args = ["hello world"]
func.apply(window, args)

答案 2 :(得分:1)

看着你的mooshell,我在mootools处理它的方式是:

http://mootools.net/shell/yL93N/10/

var proxyFunction = new Class({
    message: "hello",
    Binds: ['passByReference','sayit'],
    passByReference: function(func) {
        // console.log(this, this[func]);
        if (this[func] && $type(this[func]) === "function")
            this[func]();
    },
    sayit: function() {
        alert(this.message);
    },
    killit: function() {
        document.write('we\'re dead');
    }
});

$('tryit').addEvent('change',function(e){
    new proxyFunction().passByReference(this.get('value'));
});

// or have a permanent proxy instance if you call methods of the class often and need it to change things.

var proxy = new proxyFunction();
$('tryit').addEvent('change',function(e){
    proxy.passByReference(this.get('value'));
});
这样做的好处是所有代理函数都在公共对象后面,不会将窗口名称空间污染为全局变量,并且可以共享与事件相关的数据。

答案 3 :(得分:0)

喜欢这个吗?

function blah() {
...do stuff
}

myref = blah

myref() 

答案 4 :(得分:0)

最好的方法是:

func.call();

答案 5 :(得分:0)

JavaScript中的函数变量已经是引用。如果你有一个功能:

var explode = function() { alert('boom!'); };

您可以将explode作为参数传递,并且它只传递该函数的句柄,而不是整个函数体。

为了证明这一点,请尝试:

explode.id = 5;
var detonate = explode;
alert(detonate.id); // => 5
explode.id = 6;
alert(detonate.id); // => 6

答案 6 :(得分:0)

函数是Java Script中的第一类对象。实际上,这意味着您可以将它视为变量,并将其传递给您期望变量的任何位置。

e.g。

var myFn = function() { alert('inside anonymous fn'); }

function callMyFn(paramFn) 
{
  paramFn();
}

callMyFn(myFn); //inside anonymous fn

function MyFnHolders(argFn)
{
  this.argFn = argFn;
  this.fieldFn = function() {
    alert('inside fn field');
  }
}

var myFnHolders = new MyFnHolders(myFn);
myFnHolders.argFn();   //'inside anonymous fn'
myFnHolders.fieldFn(); //'inside fn field'

//etc

所以通过ref传递函数可以简单地通过将其赋值给变量并传递它来完成。

答案 7 :(得分:0)

这里有一个关闭你的论点......

function Runner(func, args) {
  return function() { return func.apply(window, args); };
}

var ref = new Runner(window.alert, ["hello world"]);
ref();