kei*_*ant 14 javascript syntax jquery closures
我已经看过很多带有以下语法的jQuery代码,但我真的不明白它的含义.它出现在这个答案和关于代码组织的问题的答案中.两者都谈论命名空间,所以我猜这就是它的成就.
var foo = (function () {
var someVar;
function someFunc() {
return true;
}
})();
Run Code Online (Sandbox Code Playgroud)
这是用于命名空间,它是如何工作的?有时在最后一组括号中有一个名称(命名空间?),有时不是.两者有什么区别?
use*_*716 15
在()该包裹功能会将匿名函数声明为可随后与被立即调用的函数表达式()下面的表达式.
在这种情况下,外部()确实不是必需的,因为它var foo =会把它变成表达式.此外,值foo将是undefined因为函数调用不返回任何内容.
它可以用于创建一个新的变量范围,因为函数是在javascript中实现它的唯一方法.(Javascript没有块范围.)
因此someVar外部范围无法访问该变量.有时可能希望以受控方式使其可访问.为此,您可以将函数传递给引用的作用域someVar.然后在函数调用退出后,其执行上下文将保持不变,并且someVar将以您传递的函数提供的任何方式提供.
这称为创建closure.
假设您将一个值传递给调用,并将其分配给someVar.然后,您可以return通过调用foo变量来调用函数.如果该函数返回引用someVar,则可以使用该函数获取其值.
var foo = (function ( str ) {
var someVar = str;
/*
function someFunc() {
return true;
}
*/
return function() {
alert( someVar );
};
})( 'somevalue' );
foo(); // alerts 'somevalue'
Run Code Online (Sandbox Code Playgroud)
如您所见,现在引用的函数foo仍然可以访问someVar.
假设您更改了它,以便返回的函数foo可以接受一个参数,该参数将更新值myVar.
var foo = (function ( str ) {
var someVar = str;
/*
function someFunc() {
return true;
}
*/
return function( n ) {
if( n ) {
someVar = n;
} else {
alert( someVar );
}
};
})( 'somevalue' );
foo(); // alerts 'somevalue'
foo( 'newvalue' ); // give it a new value
foo(); // alerts 'newvalue'
Run Code Online (Sandbox Code Playgroud)
现在您可以看到,函数foo确实可以访问该变量,因为它可以更改其值,并引用先前设置的新值.
括号包围匿名函数,以使其成为可以通过在其后添加参数直接调用的变量.
(function(param) {
// do stuff
})(param);
Run Code Online (Sandbox Code Playgroud)
最后的位不是命名空间,只是一个参数.你可能已经看到这用于jQuery:
(function($) {
$('.something').addClass('.other');
})(jQuery);
Run Code Online (Sandbox Code Playgroud)
这样做是将jQuery对象传递给函数,使$变量成为匿名函数范围内的jQuery对象.人们喜欢使用速记$,但它可能导致与其他图书馆的冲突.此技术通过将完全限定的jQuery对象传入和覆盖该$函数范围内的变量来消除冲突的可能性,因此可以使用该快捷方式.
| 归档时间: |
|
| 查看次数: |
5698 次 |
| 最近记录: |