我最近开始深入研究JavaScript,并在JQuery中遇到了这个代码构造.
(function( window, undefined ) {
})(window)
Run Code Online (Sandbox Code Playgroud)
阅读堆栈溢出(和其他地方)我得出结论,这是相同的
function foo(window, undefined) {
...
}
foo(window);
Run Code Online (Sandbox Code Playgroud)
我的假设是否正确?如果是这样,前者的优势是什么?(除了令人困惑的新手)
我有以下插件:
;(function($, window, document)
{
...
...
})(jQuery, window, document);
Run Code Online (Sandbox Code Playgroud)
我能理解是什么; 是为了并且也意识到$是jQuery,但有人可以解释为什么函数后跟(jQuery,window,document);
在John Resig关于他如何构建jQuery 1.4 的幻灯片中,他提到了一个点,他undefined在jQuery闭包中添加了一个变量,因为"我们可以重用(变量)".
undefined 不是一个普通的变量:
> var undefined = 4
undefined
> undefined
undefined
Run Code Online (Sandbox Code Playgroud)
因此,我们知道undefined不是变量.那么为什么undefined在jQuery源代码中会重新定义?

在一些使用立即函数的Javascript代码中,它有参数window或document类似如下:
(function (window, document) {
...
})(window, document);
Run Code Online (Sandbox Code Playgroud)
然而,window和document是全局对象,可通过后续可直接访问:
(function () {
var userAgent = window.navigator.userAgent;
...
var el = document.getElementById(...)
...
})();
Run Code Online (Sandbox Code Playgroud)
上述两个代码之间有什么区别.哪种方式更好,为什么?
我发现有些地方的人正在编写带有启动功能的JavaScript(未定义).我可以知道为什么他们这样写这样的优点和缺点是使用这样的
(function(undefined) {
/* some logic functions etc..*/
})();
Run Code Online (Sandbox Code Playgroud) 以下示例之间有什么区别吗?
例1:
(function (window) {
'use strict';
console.log(window)
})(window);
Run Code Online (Sandbox Code Playgroud)
例2:
(function () {
'use strict';
console.log(window)
})();
Run Code Online (Sandbox Code Playgroud)
传递窗口对象是否可选?
可能重复:
这个JavaScript/JQuery语法如何工作:( function(window,undefined){})(window)?
我试图了解js范围和匿名函数.我试图读取jQuery.js文件,它看起来像这样:
(function( window, undefined ) {
...
}(window));
Run Code Online (Sandbox Code Playgroud)
undefined当执行时没有参数传递给它时,为什么它在函数参数中有?
我见过这样的例子
(function($, window, undefined) {
...
// Do awesome stuff
...
})(jQuery, this);
Run Code Online (Sandbox Code Playgroud)
我理解将jQuery作为参数传递并接收为$.
这样做是为了避免jquery的$和任何全局变量$(由错误或某些第三方库定义)之间的冲突.
为什么人们传递this和接受window,并得到undefined函数的参数?
我们有什么方法可以覆盖窗口和undefined?
PS:我已经在Chrome中试过了
undefined = 2; // 2
undefined == 2; // false
Run Code Online (Sandbox Code Playgroud)
它证明未定义不能被覆盖.
使用jQuery for循环非常慢,这就是我考虑更频繁地使用常规for语句的原因.为了直接访问当前元素,我发现了以下语法(对于常规数组,当然不是对象):
for (var i = 0, e; e = array[i]; i++) { ... }
Run Code Online (Sandbox Code Playgroud)
e循环中的哪个位置表示当前元素.
这种语法在所有浏览器中都可以安全使用吗?
加成
好吧,我想这可行,但对于简短的符号它不再那么有用了:
for (var i = 0, e; (e = array[i]) !== void(0); i++) { ... }
Run Code Online (Sandbox Code Playgroud)
谢谢大家回答!
在下面的代码中jQuery,为什么下一个参数是undefined
JavaScript的:
(function(a,b){
....
})(window)
Run Code Online (Sandbox Code Playgroud)
在这里a=window,但是b=undefined,为什么会这样?