【问题标题】:Calling a function within jQuery from global scope从全局范围调用 jQuery 中的函数
【发布时间】:2014-01-07 05:25:30
【问题描述】:

我已经看到了几个与此相关的问题,但没有一个提供明确的答案。

在这个 JavaScript 中:

function global_function() {
    a_jquery_function();
}

$(function () {
    var a_jquery_function = function () {
        do_something();
    };
});

我可以做点什么让全局函数调用 jQuery 函数吗?显然,它不能像我在那里那样做,但我想知道是否可以使用jQuery.fn 或使用自定义事件来完成。例如:

function global_function() {
    $.fn.a_jquery_function();
}

$(function () {
    $.fn.a_jquery_function() = function () {
        do_something();
    };
});

function global_function() {
    trigger_event('my_event', args);
}

$(function () {
    $(document).on('my_event', function(args) {
        do_something();
    });
});

我尝试了第一个,但遇到了问题。如果我知道其中任何一个都是可能的,我会更多地研究它们。但如果有人知道这是不可能的,我想我将不得不放弃它。

谢谢。

【问题讨论】:

  • 实际情况是什么?
  • 感谢您的编辑,tymeJV。我校对了帖子,但显然不是标题。哎呀。
  • 为什么两者都做不到?您是否怀疑有不屈不挠的编程物理定律会阻止它?第一个实例实际上只是创建一个全局变量,因为您将属性附加到可从全局变量 $ 访问的对象。
  • 为什么要在变量名的末尾加上括号?
  • 我需要使用需要全局声明函数的 YouTube IFrame API。主要的是视频帧准备就绪时的事件处理程序。但我希望这些函数能够与在 jQuery 块中定义的其余代码进行交互。我也不希望在全局范围内定义超过绝对最小数量的函数。

标签: javascript jquery scope


【解决方案1】:

您可以将函数附加到 jQuery 命名空间,在某种意义上将它们变成 jQuery 插件。到那时,无论 jquery 在哪里,它们都可以使用。

function global_function() {
    $.a_jquery_function();
}

$(function () {
    $.a_jquery_function = function () {
        do_something();
    };
});

【讨论】:

  • 有一个可能的问题。如果 global_function 在 dom 准备好之前执行怎么办?你最好在 dom ready 之外定义函数。这个可能的问题会影响我们的两个代码示例。
  • 我知道这个问题,但在这种情况下,这是不可能的。你的答案现在对我来说看起来非常明显,但从另一个角度考虑。我正在向$ 添加一个元素,其他所有内容都在 jQuery 范围内。这绝对是完美的。再次感谢。
【解决方案2】:

如果您不想污染全局命名空间,请创建对象并向其附加函数。

var myModule = {};
$(function(){
    var foo = function(){/*code*/};
    myModule.bar = foo;
});

然后你可以使用myModule.bar()从任何地方调用你的函数;

【讨论】:

  • myModule 对象是否会落入全局命名空间,因为您在任何其他对象或函数之外声明它?
  • 不,myModule 将是当前脚本的本地。这几乎就是我想要的。我试试看。
  • @eje211 当前脚本应该在窗口的全局范围内(即对象落入全局命名空间)。
  • 不,myModule 将是全球性的。但这只是一个对象,作者说“我不希望在全局范围内定义超过绝对最小数量的函数”。这是绝对最小值 - 全局命名空间中的一个对象。
【解决方案3】:

在声明您希望全局可用的功能时,您应该使用window.functionname=function{},而不是使用var functionname=function(){}。 所有全局函数都是window对象的属性,反之亦然,window对象的所有属性都是全局函数。

【讨论】:

  • 基础是一个函数创建一个新的作用域,在作用域内使用 var 关键字声明的任何东西都将是作用域的本地,除非以某种方式显式共享。使用 window.functionname 是一种方式,返回函数指针是另一种方式,还有更多。但是一旦你了解了范围,这个问题就很容易回答了。
  • 这可行,但这里的重点不是创建一个全局函数。 window.functionname 在 DOM 编程的上下文中是全局的。它有效,但我希望有比这更整洁的东西。
  • @eje211 使用window.functionname 只是导出方法的一种方式,用全局可用的任何属性替换“窗口”同样容易。
【解决方案4】:

你可以像这样编写你的全局 jQuery 函数

(function($){
  $.fn.func_name = function(var){
      write your code and functions here
  }
})(jQuery);

在您的 html 或 js 文件中调用 $().func_name(var) 进行注册。


【讨论】:

    猜你喜欢
    • 2013-06-21
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 2013-12-12
    相关资源
    最近更新 更多