2010-04-26 44 views
1

我只是好奇,如果我能传递一个函数作为变量。例如: 我有一个函数JQuery的 Java脚本 - 传递函数为变量

$('#validate').makeFloat({x:671,y:70,limitY:700}); 

我愿做这样的事情:

$('#validate').makeFloat({x:function(){ return $("#tabs").offset().left+$("#tabs").width();},y:70,limitY:700}); 

这是不行的,但最好每一个变量被访问时,将计算出新的价值。所以,如果窗口大小会自动调整,而不是在静态的通过一个变量。我知道我可以直接在功能\小部件内实现这一点,但我想知道是否有某种方式做这样的事情上面。

这个概念与插件无关。我正在谈论的功能是“铸造”作为一个变量。

+0

这不会,除非makeFloat工作()支持它。 – 2010-04-26 20:55:38

回答

2

是的,您可以传递一个对象,该对象在读取其属性(称为getter)时会调用某个函数,但它不是跨浏览器兼容的。例如,这将(可能)在IE9工作:

var o = {y:70, limitY:700}; 
Object.defineProperty(o, 'x', {get: function() {return 671;}}); 
$('#validate').makeFloat(o); 

还有其他的语法为其他浏览器如__defineGetter__针对Firefox和一些浏览器不具备此功能的。所以它几乎是无用的,除非你能完全控制代码运行的环境。

+0

宾果。这是我想要的。它吮吸这是不规范的,虽然:( 谢谢 乔希。 – 2010-04-26 21:18:22

+0

哇,不知道这样的功能存在。我GOOGLE了一下,发现的Webkit /普雷斯托/壁虎有过这样实施了一段时间,其执行似乎在ECMAScript的标准化3.1/4 http://annevankesteren.nl/2009/01/gettters-setters – jholster 2010-04-26 22:17:28

0

你是什么意思“不起作用”?

它看起来应该编译和运行。但是,会发生什么是它执行的功能,并将其值不超过,如果你使用一个常数,或称那是不是内联函数不同。

你需要做的是将这行代码放在窗口重新调整大小时触发的事件中。

0

它看起来像makeFloat是从一个jQuery插件 - 你确定该插件知道'x'可以是一个函数,并将正确执行它?从jQuery的网站,它看起来像它仅是能够理解一个数值或“当前”的字符串,而不是功能。

0

你可以传递函数作为变量,是的 - 但这实际上并不是你要求的。

它看起来像你问的是“我可以设置一个表达式的结果DOM属性?”答案是“否”。 (注意 - 不是IE浏览器的CSS表达式之类的浏览器特有的行为 - 在IE8中已弃用)

您需要将事件处理程序绑定到window.onresize并使用函数来自己更新大小。

1

除非调用xobj.x()而不是obj.x),否则这将不起作用。

要使其工作,makeFloat()代码必须检查x的类型,如果它是一个函数,则调用它。

+0

即使这样,除非'makeFloat()'为窗口大小调整添加了绑定,否则它将不起作用。 – 2010-04-26 20:59:28

+2

@彼得,这是次要问题。 jweyrich指出为什么OP的建议不会在概念上起作用。 – 2010-04-26 21:00:53

+0

Vivin表示,该职位的实际更新是次要细节。我一直在寻找一个关于传递函数作为参数的问题。谢谢。 – 2010-04-26 21:08:41

0

为了使函数从变量被执行,它必须被调用,像这样:

$.option.callback.call(); 

option是包含可变,callback是函数和call执行功能。

这不像你没有选择。您可以进行设置,以便从该行本身执行该函数的返回值。或者你可以用你描述的另一种方式进行设置。

1

我明白你想要做什么,但它不会工作。为什么? makeFloat预计值是无功能型。它可能直接使用该值。为了实际执行该功能,makeFloat需要做x()甚至x.call(...)x.apply(...),这当然不是这样做的。

要回答你的其他问题,即你能否将函数作为变量传递,答案是肯定的。事实上,这是回调和闭包在Javascript中处理的方式。例如,在jQuery的在绑定要传递的函数作为参数的事件处理程序:

jQuery("#myInputId").click(function() { 
... 
... 
}); 

该参数在被传递的另一种方法是作为对象的属性,例如在jQuery.ajax:

jQuery.ajax({ 
    ... 
    success: function(data) { 
    }, 
    ... 
}); 

在这两种情况下,clickajax都理解并期望该参数是一个函数而不仅仅是一个常规变量。例如,假设您有一个保持整数列表的对象,并且您有一个名为addElement(int)的方法,该方法预计为int参数,则不会传入String。它在Javascript中以相同的方式工作,除了语言不是强类型的事实。这就是为什么你不会真的得到一个类型不匹配的错误,除非该函数显式检查类型并引发异常。这种语言通常是一种很好的做法;我尝试在我编写的Javascript代码中执行此操作。

0

请注意,x在访问(读取)时不会“计算新值”,而是调用函数时,即x()。乍得提到的,这是怎么当的窗口大小调整就可以自动执行功能:

$(window).resize(function() { 
    // do something 
}); 

[更新]重新阅读您的问题后,我想你也许会认为过于复杂的 - 这不就是你是什么寻找?

$('#validate').makeFloat({ 
    x: $("#tabs").offset().left + $("#tabs").width(), 
    y: 70, 
    limitY: 700 
}); 
+0

关闭,但只计算一次。我在寻找这个函数作为内部变量来处理。所以例如在内部,插件会看到x,但是当它读取或获取x时,x会被重新计算。我希望JQuery \ javascript支持这一点,但我现在看到我必须在插件中添加实现才能实现此目的。 我想要的是什么是.NET – 2010-04-26 21:16:42

+0

感谢澄清获取属性的变体。 – jholster 2010-04-26 22:06:37

0

您需要调用该函数,以便返回您正在查找的实际值。所以你实际上并没有传入一个函数,而是在调用它并立即返回一个值。例如:

$('#validate').makeFloat({ 
    x:function(){ 
    return $("#tabs").offset().left+$("#tabs").width(); 
    }(), 
    y:70, 
    limitY:700 
}); 

注意函数调用后的extra()。这会立即调用该函数,从而返回您正在查找的值。

+0

虽然这是接近我一直在寻找,这将是一样的只是把的功能是什么(不含返程)内直接在参数。我想将内联函数“转换”为变量,因此无论何时内部插件访问该变量,它都会调用该函数。从其他职位,据我了解,这需要更多的被添加到插件。我基本上想看看Jqeury是否作为框架的一部分来实施。 – 2010-04-26 21:12:26

+0

一个疑难杂症,当然,亚当然,我显然没有想到与答案 – brad 2010-04-27 20:44:16

1

我已经完成了这个字符串变量。你需要利用toString函数。

function RefString(fn) { this.toString = function() { return String(fn()); }; } 

您可以使用它像这样:

$("#someDiv").somePlugin({optionValue: new RefString(MyFunc), ... }); 

function MyFunc() { 
    return new Date().getYear().toString(); 
} 

它通过设置optionValue到一个新的对象,不一定是功能。然后读取这个对象的任何东西都会要求一个值,这个值默认是toString函数的结果。我们只需通过执行构造对象时指定的函数来覆盖默认行为。

我不知道它将如何为每个插件的工作,但是当一个字符串 或数字 预计它的工作原理。

+0

+1实施 - 。但是我有使用它的整数麻烦我也找不到RefString任何文件:( – 2010-04-26 21:29:34

+0

@Josh:没有文件:RefString是我发明 – 2010-04-28 13:03:34

+0

哦,我没看出来定义,我必须错过了我第一次读它。 – 2010-04-28 20:07:05