JQuery\Javascript-将函数作为变量传递

JQuery\Javascript-将函数作为变量传递,javascript,jquery,Javascript,Jquery,我只是好奇我是否能把函数作为变量传递。例如: 我有一个函数 $('#validate').makeFloat({x:671,y:70,limitY:700}); 我想这样做: $('#validate').makeFloat({x:function(){ return $("#tabs").offset().left+$("#tabs").width();},y:70,limitY:700}); 这不起作用,但理想情况下,每次访问变量时,它都会计算新值。因此,如果调整窗口的大小,它将自动进行

我只是好奇我是否能把函数作为变量传递。例如: 我有一个函数

$('#validate').makeFloat({x:671,y:70,limitY:700});
我想这样做:

$('#validate').makeFloat({x:function(){ return $("#tabs").offset().left+$("#tabs").width();},y:70,limitY:700});
这不起作用,但理想情况下,每次访问变量时,它都会计算新值。因此,如果调整窗口的大小,它将自动进行调整,而不是以静态方式传入变量。我意识到我可以直接在function\widget中实现这一点,但我想知道是否有某种方法可以实现上述操作


这个概念独立于插件。我说的是将函数转换为变量。

你是什么意思

看起来它应该编译并运行。但它执行函数并设置值与使用常量或调用非内联函数时没有区别


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

您怎么说它不工作

看起来它应该编译并运行。但它执行函数并设置值与使用常量或调用非内联函数时没有区别


您需要做的是将这行代码放入一个事件中,该事件在重新调整窗口大小时触发。

看起来makeFloat来自jQuery插件-您确定该插件知道“x”可以是一个函数并正确执行它吗?从jQuery站点上看,它似乎只能将数值或“current”理解为字符串,而不能理解为函数

看起来makeFloat来自jQuery插件-您确定该插件知道“x”可以是一个函数,并且会正确执行它吗?从jQuery站点上看,它似乎只能将数值或“current”理解为字符串,而不能理解为函数

您可以将函数作为变量传递,是的-但实际上这不是您所要求的

您的问题是,我可以将DOM属性设置为表达式的结果吗?答案是否定的。请注意——不在特定于浏览器的行为之外,比如IE的CSS表达式——这些行为在IE8中已经被弃用了


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

您可以将函数作为变量传递,是的-但实际上这并不是您想要的

您的问题是,我可以将DOM属性设置为表达式的结果吗?答案是否定的。请注意——不在特定于浏览器的行为之外,比如IE的CSS表达式——这些行为在IE8中已经被弃用了

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

除非调用了obj.x,而不仅仅是obj.x,否则这将不起作用

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

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


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

为了从变量执行函数,必须调用它,如下所示:

$.option.callback.call();
其中option是包含变量,callback是函数,call执行函数

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

但这并不是说你没有选择。您可以对其进行设置,以便从行本身执行该函数的返回值。或者,您可以按照您描述的其他方式进行设置。

为了从变量执行函数,必须调用它,如下所示:

$.option.callback.call();
其中option是包含变量,callback是函数,call执行函数

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

但这并不是说你没有选择。您可以对其进行设置,以便从行本身执行该函数的返回值。或者您可以按照您描述的其他方式进行设置。

我知道您正在尝试做什么,但它不起作用。为什么?makeFloat希望该值为非函数类型。它可能直接使用该值。要实际执行该函数,makeFloat需要执行x甚至x.call。。。或者x.apply…,它肯定不会这么做

要回答您的另一个问题,即是否可以将函数作为变量传递,答案是肯定的。事实上,这就是Javascript中处理回调和闭包的方式。例如,在jQuery中,当绑定事件处理程序时,将函数作为参数传入:

jQuery("#myInputId").click(function() {
 ...
 ...
});
传递参数的另一种方式是作为对象属性,例如在jQuery.ajax中:

jQuery.ajax({
   ...
   success: function(data) {
   },
   ...
});
在这两种情况下,click和ajax都理解并期望参数是一个函数,而不仅仅是一个常规变量。例如,假设您有一个维护整数列表的对象,并且您有一个名为AddElementent的方法,该方法需要一个int参数,那么您不会传入字符串。它在Javascript中的工作方式相同,只是
e语言不是强类型的。这就是为什么除非函数显式检查类型并抛出异常,否则不会真正得到类型不匹配错误。在这种语言中,这通常是一种很好的做法;我试图在我编写的Javascript代码中实现这一点。

我知道您正在尝试做什么,但它不起作用。为什么?makeFloat希望该值为非函数类型。它可能直接使用该值。要实际执行该函数,makeFloat需要执行x甚至x.call。。。或者x.apply…,它肯定不会这么做

要回答您的另一个问题,即是否可以将函数作为变量传递,答案是肯定的。事实上,这就是Javascript中处理回调和闭包的方式。例如,在jQuery中,当绑定事件处理程序时,将函数作为参数传入:

jQuery("#myInputId").click(function() {
 ...
 ...
});
传递参数的另一种方式是作为对象属性,例如在jQuery.ajax中:

jQuery.ajax({
   ...
   success: function(data) {
   },
   ...
});
在这两种情况下,click和ajax都理解并期望参数是一个函数,而不仅仅是一个常规变量。例如,假设您有一个维护整数列表的对象,并且您有一个名为AddElementent的方法,该方法需要一个int参数,那么您不会传入字符串。它在Javascript中的工作方式相同,只是语言不是强类型。这就是为什么除非函数显式检查类型并抛出异常,否则不会真正得到类型不匹配错误。在这种语言中,这通常是一种很好的做法;我试图在我编写的Javascript代码中做到这一点。

请注意,当被读取时,x不会计算新值,但当调用函数时,即x。正如Chad提到的,这是在调整窗口大小时自动执行函数的方式:

$(window).resize(function() {
    // do something
});
[更新]在重新阅读您的问题后,我认为您的想法可能过于复杂——这不是您想要的吗

$('#validate').makeFloat({
    x: $("#tabs").offset().left + $("#tabs").width(),
    y: 70,
    limitY: 700
});
请注意,当被读取时,x不会计算新值,但当调用函数时,即x。正如Chad提到的,这是在调整窗口大小时自动执行函数的方式:

$(window).resize(function() {
    // do something
});
[更新]在重新阅读您的问题后,我认为您的想法可能过于复杂——这不是您想要的吗

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

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

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

注意函数调用后的额外内容。这会立即调用函数,从而返回您要查找的值。

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

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

注意函数调用后的额外内容。这将立即调用函数,从而返回您要查找的值。

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

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

其他浏览器也有其他语法,比如Firefox的_defineGetter _uu,有些浏览器根本没有这个功能。因此,除非您能够完全控制代码运行的环境,否则它实际上是无用的。

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

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

其他浏览器也有其他语法,比如Firefox的_defineGetter _uu,有些浏览器根本没有这个功能。因此,除非您能够完全控制代码运行的环境,否则它实际上是无用的。

我已经用字符串变量完成了这项工作。您需要利用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函数的结果。我们只是通过执行在构造对象时指定的函数来覆盖默认行为


我不确定它如何适用于每个插件,但它在需要字符串或数字时工作。

我已经用字符串变量完成了这项工作。您需要利用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函数的结果。我们只是通过执行在构造对象时指定的函数来覆盖默认行为


我不确定它如何适用于每个插件,但它在需要字符串或数字时工作。

除非makeFloat支持它,否则无法工作。除非makeFloat支持它,否则无法工作

支持它。即使这样,除非makeFloat为窗口大小调整添加绑定,否则它也不会工作。@Peter这是第二个问题。jweyrich指出了OP的建议在概念上不起作用的原因。正如Vivin所指出的,职位的实际更新是次要细节。我想在传递函数作为参数的上下文中解决这个问题。谢谢。即使这样,除非makeFloat为窗口大小调整添加了绑定,否则它也不会起作用。@Peter这是第二个问题。jweyrich指出了OP的建议在概念上不起作用的原因。正如Vivin所指出的,职位的实际更新是次要细节。我想在传递函数作为参数的上下文中解决这个问题。谢谢。虽然这与我想要的很接近,但这与将函数中的内容直接放在参数中,而不包括返回内容是一样的。我希望内联函数被转换为变量,这样每当内部插件访问变量时,它就会调用该函数。据我所知,从其他帖子来看,这需要在插件中添加更多内容。我基本上是想看看Jqeury是否作为框架的一部分实现。明白了,是的,当然,我显然没有考虑这个答案。虽然这接近于我所寻找的,但这将等同于将函数中的内容直接放入参数中,不包括返回。我希望内联函数被转换为变量,这样每当内部插件访问变量时,它就会调用该函数。据我所知,从其他帖子来看,这需要在插件中添加更多内容。我基本上是想看看Jqeury是否作为框架的一部分实现。当然,我明白了,我显然没有考虑这个答案,只是它只计算了一次。我希望函数在内部被视为变量。例如,插件在内部看到x,但当它读取或得到x时,x会被重新计算。我希望JQuery\javascript能够支持这一点,但现在我看到我必须在插件中添加实现才能做到这一点。我想要的是.NETClose中get属性的变体,只是它只计算一次。我希望函数在内部被视为变量。例如,插件在内部看到x,但当它读取或得到x时,x会被重新计算。我希望JQuery\javascript能够支持这一点,但现在我看到我必须在插件中添加实现才能做到这一点。我想要的是.NETBingo中get属性的一个变体。这就是我想要的。很糟糕,这不是标准化的:谢谢你,乔希。哇,我不知道有这样的功能存在。我在谷歌上搜索了一下,发现Webkit/Presto/Gecko已经实现了一段时间,并且它们的实现似乎在ECMAScript 3.1/4中得到了标准化。答对 了这就是我想要的。很糟糕,这不是标准化的:谢谢你,乔希。哇,我不知道有这样的功能存在。我在谷歌上搜索了一下,发现Webkit/Presto/Gecko已经实现了一段时间,并且它们的实现似乎在ECMAScript 3.1/4中得到了标准化+1用于实现-但我在ints中使用它时遇到问题。我也找不到任何关于RefString的文档:@Josh:没有文档:RefString是我的发明。哦,我没有看到它的定义,我第一次读它时一定错过了它。+1用于实现-但我在使用它进行ints时遇到了麻烦。我也找不到关于RefString的任何文档:@Josh:没有文档:RefString是我的发明。哦,我没有看到它的定义,我第一次读它时一定错过了。