需要帮助破译JQuery示例吗
我刚开始学习jQuery和oojavascript,所以我试图弄清楚哪个属于哪个,它们做什么。我在JQuery文档中发现了这段代码需要帮助破译JQuery示例吗,jquery,Jquery,我刚开始学习jQuery和oojavascript,所以我试图弄清楚哪个属于哪个,它们做什么。我在JQuery文档中发现了这段代码 (function($sub) { $sub // a subclass of jQuery $sub === jQuery; //= false $sub.fn.myCustomMethod = function(){ return 'just for me'; } $sub(document).ready(function()
(function($sub) {
$sub // a subclass of jQuery
$sub === jQuery; //= false
$sub.fn.myCustomMethod = function(){
return 'just for me';
}
$sub(document).ready(function() {
$sub('body').myCustomMethod(); //= 'just for me'
});
})(jQuery.subclass());
问题:
function() {
}();
它们本身都是无效的,因为它们会导致语法错误,而且在底部调用它会让人感到困惑
这就是为什么JavaScript社区在自调用函数开始时使用(
)让代码的其他读者知道它不是一个正常的函数
var o = (function() {
})();
每当我看到以(
开头的函数时,我知道它是自调用的。这意味着它会立即执行,o
包含函数的返回值,而不是函数
var o = (function() {
})();
(2)jQuery子类
function() {
}();
小心使用子类依赖于jQuery1.5。我建议您等待正式发布,而不是使用1.5RC1,因为还有一些bug需要解决
jQuery.subclass
是jquery1.5测试版的一部分。它是jQuery的一个新特性,本质上是jQuery的一个子类
这意味着您添加到的任何内容都不会添加到jQuery。jQuery子类具有jQuery的所有功能,但您添加或更改的任何内容都不会影响“全局jQuery”
注释样本源
// self invoking function. This creates a closure so that anything declared in
// this function is local and doesn't effect global state
(function($sub) {
$sub // a subclass of jQuery
$sub === jQuery; //= false
// here we extend $.fn with a new method. This actually extends the prototype of $sub
// $sub.fn === $sub.prototype === $()
// $sub.fn is actually a new jQuery object. This means that when using $sub we first look
// for method defined on $sub.fn, and if there aren't any we look on methods defined
// on $.fn. A useful feature of this is that you can overwrite methods
$sub.fn.myCustomMethod = function(){
return 'just for me';
}
// We can "overwrite" methods of jQuery by hiding the original methods.
$sub.fn.attr = function() {
alert("new attr!");
// you can go into $sub.superclass to get the original $ object and call methods there
$sub.superclass.attr.apply(this, arguments);
}
// This calls .ready from the original jQuery
$sub(document).ready(function() {
$sub('body').myCustomMethod(); //= 'just for me'
});
// we pass in a subclass of jquery at the bottom. This means that $sub has all the
// functionality of $ but doesn't change $ itself.
})(jQuery.subclass());
免责声明\uuuuu proto\uuuuuu
已弃用且不正确。它仅用于说明jQuery.subclass的原型链的外观
对于那些理解的人(这会得到对象构造函数的原型)
如果需要进一步的解释,或者如果你对其他事情感到好奇,请一定要提出来。我可能掩盖了一些我认为很明显的事情
函数dirty($arg){…}
在全局范围内可见
(function dirty($arg){…})(“some arg”);
在全局作用域中不可见-它使用自己的作用域创建一个函数,并立即调用它,如果它没有分配给变量,则引用将丢失
通过这种方式,您可以在不更改全局jQuery对象的情况下更改jQuery的函数
2.从jQuery API文档中-
创建jQuery的子类
对象,允许您添加其他
或者修改jQuery方法和
属性而不影响
全局jQuery
@Goleztroll从技术上讲,表达式返回调用函数的值,因为外圆括号在调用后结束。不,它不返回。括号中只包含函数声明。括号在函数结束后关闭。您的第1点是错误的。
()
不创建闭包。关键是使语句有效并使读者意识到它是自调用的。例如,它在全局范围中不可见是因为它是一个函数表达式而不是一个声明。它与闭包无关。除非输入新的函数块,否则不会创建新的范围将jQuery扩展为子类这允许您在本地覆盖jQuery方法,而不影响页面上的其他代码。是的,()用于生成有效语句,但整个过程是一个闭包(我使用的闭包定义是函数加上函数作用域中所有定义的变量)函数($arg){..})($arg)stuff用于从全局范围隐藏内容。