Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JQuery插件架构,在哪里定义对象和变量生命周期?_Javascript_Jquery_Jquery Plugins_Requestanimationframe - Fatal编程技术网

Javascript JQuery插件架构,在哪里定义对象和变量生命周期?

Javascript JQuery插件架构,在哪里定义对象和变量生命周期?,javascript,jquery,jquery-plugins,requestanimationframe,Javascript,Jquery,Jquery Plugins,Requestanimationframe,我正在编写一个jquery插件来在画布中渲染图像 最终目标是实现以下目标 var myImageSource = new ImageSource(path,width,height); $("#myCanvas").Render({"source" : myImageSource}); 该插件需要几个类、herpers和其他一些jquery插件才能正常工作 假设我依赖于 鼠标滚轮jquery插件 一个缓存库,它不是jquery插件,而是一个具有原型和一些枚举的对象 我有一个动画引擎,它是一个

我正在编写一个jquery插件来在画布中渲染图像

最终目标是实现以下目标

var myImageSource = new ImageSource(path,width,height);
$("#myCanvas").Render({"source" : myImageSource}); 
该插件需要几个类、herpers和其他一些jquery插件才能正常工作

假设我依赖于

鼠标滚轮jquery插件 一个缓存库,它不是jquery插件,而是一个具有原型和一些枚举的对象 我有一个动画引擎,它是一个循环,需要一个全局变量,或者至少在插件级别

function runAnimations(timeStamp) {

    window.requestAnimationFrame(runAnimations);

    for (var i = 0; i < animations.length; i++) {
        animations[i].update(timeStamp);
    }
}
我必须定义自己喜欢的对象

指向 长方形 视区 影像源 动画1 所以我的尝试是这样的:

 - Reference to other script library (like Cache)
 - Reference to other JQuery Plugin

; (function ($, window, document, undefined) {

   //global variable declaration
   var animations = [];
   var isAnimationLoopStarted = false;

   //global functions
   function runAnimations(timeStamp) {

        window.requestAnimationFrame(runAnimations);

        for (var i = 0; i < animations.length; i++) {
            animations[i].update(timeStamp);
        }
    }

   //objects declarations
   function Rect(x, y, height, width) {
      this.x = x;
      this.y = y;
      this.width = width;
      this.height = height;
   }

  Rect.prototype.moveTo = function (x, y) {
      this.x = x;
      this.y = y;
   };

   //other object declarations Point, ImageSource, ViewPort etc..

   //plugin interface
    var methods = {
        init: function () {
            return this.each(function () {

                });
            });
        },
        destroy: function () {
            return this.each(function () {
            });
        }
    };

    $.fn.render = function (method) {
        if (method === 'destroy') {
            return methods.destroy.apply(this);
        } else {
            return methods.init.apply(this);
        }
    }

})(jQuery, window, document);
因此,我的问题是:

你认为这样行吗? 如果我这样做,ImageSource的定义在外部将不可用 插件 我应该放弃ImageSource对象而使用数组吗 对象定义没有问题 在插件式动画中定义的全局变量的生命周期是什么,它会一直可用吗? 使用动画之类的变量是最佳做法还是更好 使用.data jquery函数,但在本例中如何共享 变量 提前感谢您的帮助

弗雷德

所以我的答案是:

看起来不错。然而,在闭包参数中,不需要窗口或文档,它们是简单的全局变量。只有当您想重命名它们时,才需要它们,例如,将它们重命名为global和doc。我宁愿将脚本库接口对象作为函数的参数。 对但是构造函数是否需要在外部可用?我认为没有。如果你真的需要它们,可以在闭包内声明它们;例如,在诸如$.render之类的静态属性中导出它们。 你需要给我们ImageSource的代码,否则我们无法回答这个问题 您没有在插件中定义任何全局变量,请修改您的评论。它们是局部变量,而不是插件闭包中的私有变量,可用于该范围内的所有其他内容。它们的生命周期将随着自动垃圾收集而结束,而不再有任何东西可以引用它们。但是您将函数导出到$.fn.render,它始终具有这些引用。因此,只要导出存在,您的局部变量就会存在。 您应该钩住jQuerys动画队列。在没有.data的情况下,如何共享变量?我想说的是,属于某个DOM节点的所有内容都应该设置为数据属性,否则在初始化之后就无法访问它了,是吗?
可怕的问题标题。你能试着把它变成一个问题吗?我改变了标题,我希望现在更好。谢谢你回答了我这么大的帮助。因此,var方法将在导出的生命周期内保留,因为它在导出中被引用,如果它不是引用,那么如果收集器启动,它可能会被垃圾收集。