2012-11-14 45 views

回答

5

第一外观是函数的参数,执行所述功能时的第二被传递值的那些参数。

请记住,参数的功能并不需要匹配传递的名称(这可能,事实上,导致后来的混乱):

(function(jQuery, w) { 
    return jQuery(function(){ 
     return alert("js!"); 
    }); 
})($, window); 

会的工作方式相同。

1

这可能是更容易解释,如果你更改参数名称和命名功能

(function init($, win) { 
    return $(function() { 
    return alert("js!"); 
    }); 
})(jQuery, window); 

初始化函数被传递的参数jQuerywindow立即,因为它的定义,它们都可以作为参数传递给初始化函数作为$win

如果你打破它成等价的代码,这也可能是更容易理解

function init($, win) { 
    return $(function() { 
    return alert("js!"); 
    }); 
} 
init(jQuery, window); 
0

上面的参数集是参数被接收到的地方,底部的一组参数是它们通过的地方。

他们确保它们的全局变量的封闭副本不会在闭包之外重新分配。这是一种保护您的代码免受其他(可能写得很差)代码的方式。考虑下面这个例子:

var $ = 'foo'; 

var blah = (function($) { 
    return function() { 
     alert($); 
    }; 
})($); 

var shizzam = (function() { 
    return function() { 
     alert($); 
    }; 
})(); 

// someone evil overwrites my $ var 
$ = 'bar'; 

// blah still works 
blah(); 
// but shizzam is now borked 
shizzam(); 

http://jsfiddle.net/xfTcq/

0

当函数返回另一个函数可以在parentesis被封闭为立即执行。 最后一个括号是传递给它的参数。

你可以做一些测试就明白了:

var a (function(){}); 
typeof a; 
a.toSource() 

typeof (function(){}); 
(function(){}).toSource() 
1

在您传递参数,将在安全的范围从对未来的覆盖的方式。例如:

var a = 1 
(function(a){ 
    setTimeout(function(){ 
     console.log('This variable is still safe', a); 
    },2000) 
})(a) 
a = 0 
console.log('has changed', a) 

所以在你的例子中,你可以肯定$和窗口就是你所期待的。

相关问题