Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.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_Function_Jquery Plugins - Fatal编程技术网

Javascript 函数是否应该位于jQuery';是外展还是外展?

Javascript 函数是否应该位于jQuery';是外展还是外展?,javascript,jquery,function,jquery-plugins,Javascript,Jquery,Function,Jquery Plugins,我正在编写我的第一个jQuery插件,我不完全确定扩展声明中应该包含什么,不应该包含什么 $.fn.myplugin = function () { var somevar = this; someFunc(somevar); }; function someFunc() {/*doSomethin'*/}; 或 在第一种方法中,添加someFunc()会污染全局范围。第二种方法没有 然而,这并不意味着第二种方法更好。如果将第一个方法包含在一个闭包中,它基本上是完全相同的东西,

我正在编写我的第一个jQuery插件,我不完全确定扩展声明中应该包含什么,不应该包含什么

$.fn.myplugin = function () {
    var somevar = this;
    someFunc(somevar);
};
function someFunc() {/*doSomethin'*/};


在第一种方法中,添加
someFunc()
会污染全局范围。第二种方法没有

然而,这并不意味着第二种方法更好。如果将第一个方法包含在一个闭包中,它基本上是完全相同的东西,并归结为个人偏好。
在这里,使用第一个方法(在闭包中)可能更好,这样,如果在一个JS文件中有多个jQuery扩展,它们就可以共享这个基本函数

我会使用第一个选项,因为:

它没有任何副作用

这就是你错的地方。如果您使用不同的库,则可能会覆盖其他人的someFunc(),可能会破坏他们为您所做的一切。一种更安全的方法是在代码周围封装一个闭包

(function(){

$.fn.myplugin = function () {
    var somevar = this;
    someFunc(somevar);
};

function someFunc() {/*doSomethin'*/};

/* Do whatever other things you need someFunc/myplugin for */

})();
这样,someFunc就不受全局名称空间的影响

或者,您可能希望做的是将对象的方法公开给外部世界。例如:

$.fn.dog = function () {

     this.bark = function() {alert("Woof");};

     return this;
};

var $max = new $('#myDogMax').dog();
$max.bark();

这使函数保持在对象的上下文中,但可以从外部干净地访问它。虽然这通常意味着方法与对象有某种关联。全局编写一个bark()函数没有什么意义,因为通常是狗来执行,而不是浏览器窗口。

显然,第一个函数的问题是,如果在新项目中使用它,您需要确保已经定义了
someFunc()
,这意味着把它作为一个插件并不能真正实现什么。当然可以?@JoshStevenson我假设整个过程都会放在一个文件中,例如,
myplugin.jquery.js
,在这种情况下这并不重要,对吧?顺便说一下,你的插件应该返回匹配的元素集来保存jquerychaining@A.Wolff你能详细说明一下吗?或者让我参考有用的文档?正如我仍在学习的一样,所有的教学材料都是受欢迎的。@BramVanroy如果OP在个人库中创建了这个插件,他可以在插件中重新定义它之前检查它是否存在。这样,当插件可以使用全局作用域函数时,它就可以使用全局作用域函数,如果不能,就在插件中创建它t@SidneyLiebrand若函数是特定于插件方法的,那个么它应该在插件内部定义,否则在任何外部范围内都应该定义,这取决于用例只是为了确保,闭包的意思是类似于自调用函数的东西,对吗?
$.fn.dog = function () {

     this.bark = function() {alert("Woof");};

     return this;
};

var $max = new $('#myDogMax').dog();
$max.bark();