我发现它here
;(function ($, window, document, undefined) {
//code
}(jQuery, this, this.document));
这是我第一次看到这样的东西。它是什么以及如何解释?我不明白为什么它必须传递this和this.document,以及'undefined'是什么。
我问的原因是因为我把它包含在我的页面中
if($('ul.mtree').length)
返回false,尽管在控制台中输入时返回true。
答案 0 :(得分:16)
第一个分号;
设置以下代码,除了可能忘记分号的任何其他前面的代码。这很重要,因为如果没有找到半冒号,parens会尝试将前面的语句作为函数运行。
对于其余的代码,我们只是声明一个“内联”函数,它将立即执行,其中参数$, window, document
然后从全局范围实例化为jQuery, this, this.document
(分别) 。这主要是因为您可以在新的jQuery插件中使用“$”,而不必担心$
是否被其他地方覆盖。您可以确定$
与jQuery
相同。
详细了解“保护$ Alias并添加范围”here
从OP更新:
对于返回false的if
语句,请确保在调用if
语句时加载了html。一个快速的方法是将它包装在$(document).ready
方法中,如下所示:
$(document).ready(function () {
if($('ul.mtree').length) {
alert("got 'em!");
}
});
答案 1 :(得分:3)
这是一个立即执行的功能。的;在开始时可以防止缩小后潜在的语法错误。
函数本身提供了参数的作用域,而不是在全局范围内引用它们。它还提供了使用该函数定义的局部变量的隐私。 undefined
传递的有些令人困惑的最终参数可以防止对undefined在全局范围内所代表的内容进行恶意更改。
如果你谷歌搜索javascript术语,如自动执行函数,全局范围,闭包,模块模式,可用的资源很多。
答案 2 :(得分:2)
包含您无法使用的代码副本可能会有所帮助。
但要回答有关为什么if($('ul.mtree').length)
可以在控制台返回true
的问题,但页面中的false
可能取决于时间(例如,在DOM加载之前执行该函数)。当您加载控制台以检查值时,将加载DOM并返回true。
确保在页面末尾包含您的JS,或者仅在文档加载后调用。
答案 3 :(得分:1)
可能该代码应修复$
,window
或document
被其他值遮蔽的情况:
(function() {
var window = 123,
document = 'abc',
$ = Function.prototype;
})();
然后,
$
是jQuery
和其他图书馆使用的简写。该代码假定jQuery
未被其他内容隐藏,因此它会创建一个名为$
的变量,其值为jQuery
。this
是关键字。如果未在非严格模式下显式设置,则它将成为全局对象。因此,您的代码会使用该值创建一个局部变量window
。请注意,这很危险,因为this
可能已设置为某个值,或者在严格模式下为undefined
。this
是全局对象,this.document
将是文档对象。undefined
是全局对象的一个属性,它在ECMAScript 3中没有ReadOnly属性,因此可以覆盖它。您的代码创建一个局部变量而不分配任何值,因此它变为真正的未定义。因为ECMAScript 5不再需要这个,因为window.undefined
将[[Configurable]]和[[Writable]]属性设置为false
。然后,
(function() {
var window = 123,
document = 'abc',
$ = Function.prototype;
(function($, window, document, undefined) {
// `$`, `window`, `document` and `undefined` have been restored
})(jQuery, this, this.document);
})();
答案 4 :(得分:1)
如果我正确理解你的问题,在函数语句之前使用符号;
的函数,例如
(function(){
console.log('no name');
})();
(function(){
console.log('no name')
}());
-function(){
console.log('no name');
}();
+function(){
console.log('no name');
}();
~function(){
console.log('no name');
}();
!function(){
console.log('no name');
}();
您会看到符号,例如'()',' - ',' +','〜 ''!'
并且符号的功能是将函数语句解析为表达式并立即执行函数!
但我建议你只使用'()'执行函数语句,因为它是在例程中使用的正式方式和常规方法。