我正在阅读关于写jQuery plugins的内容,有一节讨论保留美元符号表示法,以便它不会与使用它的其他库发生冲突。
它说:
将jQuery传递给自执行函数是一种最佳实践 (闭包)将其映射到美元符号,因此不能被覆盖 由执行范围内的另一个库
以下是他们的表现:
(function( $ ) {
$.fn.myPlugin = function() {
// Do your awesome plugin stuff here
};
})( jQuery );
我正在试图理解他们在说什么以及这段代码在说什么。如何评估以下代码?
执行function($){}
并将jQuery
对象传递给它吗?
jQuery对象是否成为$?
答案 0 :(得分:2)
是;使用传递给它的function($) { ... }
对象执行jQuery
。 $
参数隐藏父作用域的$
变量(如果有),并为其赋予jQuery
变量的值,但仅限于该代码块。
您希望这样做的原因是$
可能会被其他库(例如Prototype)使用,但您仍希望能够使用$
速记对于插件中的jQuery
。通过创建一个带有$
参数并以jQuery
作为该参数执行它的函数的函数,您可以在该函数内使用$
而不是jQuery
而不覆盖{{1在Prototype使用的函数之外。
答案 1 :(得分:2)
可以写成:
function add_my_plugin_to_fn($) {
$.fn.myPlugin = function() {
}
}
add_my_plugin_to_fn(jQuery);
或
//window.jQuery = stuff; // in jquery initializer
function add_my_plugin_to_fn(any_object_with_fn_property) {
any_object_with_fn_property.fn.myPlugin = function() {
}
}
add_my_plugin_to_fn(jQuery);
所有都会为jQuery的fn.myPlugin属性添加一个函数。我们使用$的唯一原因是因为jQuery人喜欢使用单字母'$'作为函数名。它可以很容易jQuery.fn.myplugin
或jq.fn.myplugin
或_.fn.myplugin
。
这可以让你摆脱出现类似情况的情况
my_awesome_javascipt_.js
function $(add_to_this) {
return add_to_this + 1;
}
jQuery.js
window.jQuery = //all the jquery stuff
//sees that window.$ already has a function in it and leaves it alone
my_jquery_plugin.js
$.fn.myplugin; //this doesn't exist because $ is a function from the first file
//you should have used jQuery.fn.myplugin. But that is a lot to type out. Doing the
立即调用函数技巧强制使用具有该文件范围的变量'$'。
是的,语言真的应该为你做。它是一种愚蠢的机制,在全球范围内是默认的。如果你想要修复它的东西,请查看coffeescript,它可以帮助你编写没有很多基本错误的javascript