这个javascript符号是什么?

时间:2015-04-16 15:14:58

标签: javascript jquery

我发现它here

;(function ($, window, document, undefined) {
//code
}(jQuery, this, this.document));

这是我第一次看到这样的东西。它是什么以及如何解释?我不明白为什么它必须传递this和this.document,以及'undefined'是什么。

我问的原因是因为我把它包含在我的页面中

  if($('ul.mtree').length)

返回false,尽管在控制台中输入时返回true。

5 个答案:

答案 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)

可能该代码应修复$windowdocument被其他值遮蔽的情况:

(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');
}();

您会看到符号,例如'()',' - ',' +','〜 ''!'

并且符号的功能是将函数语句解析为表达式并立即执行函数!

但我建议你只使用'()'执行函数语句,因为它是在例程中使用的正式方式和常规方法。

相关问题