我没有那么多使用javascript,所以我对以下代码结构感到困惑。代码来自外部javascript文件,init函数从索引页面调用为" windows.Ux.init(xxx)"。我知道它的自我调用功能,我认为" windows" object作为参数传递给该函数。我假设" exports.Ux" line声明名称空间并为命名空间中的两个变量分配函数。我的假设是否正确?
( function( exports ) {
...
function init(x) {
...
}
..
exports.Ux = {
init: init,
clear: clear
};
})( window );
答案 0 :(得分:3)
我知道它的自我调用功能......
它是立即调用的函数表达式(" IIFE")。 (自调用函数将是递归的。)
......我假设" windows" object作为参数传递给该函数。
window
全局的值传递给它,是的。在浏览器上,它是对全局对象的引用。该值在函数的exports
参数中被接收。
我假设" exports.Ux" line声明名称空间并为命名空间中的两个变量分配函数。
不,它创建一个可通过对象Ux
引用的exports
属性访问的对象(在这种情况下是全局对象)。对象Ux
引用具有引用函数的属性(松散地,"方法")。
答案 1 :(得分:3)
此代码段定义了一个功能:
(function( exports ) {
// ...
})
立即使用参数window
:
(function ...)(window);
您可以将此调用的效果视为:
init
和clear
exports.Ux
。您的函数接受一个名为exports
的参数,并使用单个参数window
调用它,因此您可以考虑立即调用的函数调用:
window.Ux = {
init: init,
clear: clear
}
window
是Web浏览器JavaScript环境中的全局根对象。
答案 2 :(得分:3)
这称为IIFE
:
( function( exports ) {
...
function init(x) {
...
}
..
exports.Ux = {
init: init,
clear: clear
};
})( window );
exports.Ux
是你的曝光,意味着任何不属于exports.Ux
的东西都不在外面。 Encapsulation
。 因此,如果您的IIFE具有以下结构:
( function( exports ) {
...
function init(x) {
//you can use it here somePrivate()
...
}
function somePrivate(){
}
..
exports.Ux = {
init: init,
clear: clear
};
})( window );
somePrivate
功能不会通过window
对象向外界展示,但您可以在其他function
内使用它。