关于jquery:这个javascript符号是什么?

What is this javascript notation?

本问题已经有最佳答案,请猛点这里访问。

我在这里找到了

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

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

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

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

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


第一个分号;将以下代码与可能忘记分号的任何其他前面的代码区分开来。这很重要,因为如果没有找到半冒号,parens会尝试将前面的语句作为函数运行。

对于其余代码,我们只是声明一个"内联"函数,该函数将立即执行,其中参数$, window, document然后从全局范围实例化为jQuery, this, this.document(分别)。这主要是为了让您可以在新的jQuery插件中使用"$",而不必担心$是否已被其他地方覆盖。您可以确定$jQuery相同。

在此处阅读有关"保护$ Alias和添加范围"的更多信息

OP更新:

对于返回false的if语句,请确保在调用if语句时加载了html。一个快速的方法是将它包装在一个$(document).ready方法中,如下所示:

1
2
3
4
5
$(document).ready(function () {
    if($('ul.mtree').length) {
         alert("got 'em!");
    }
});


这是一个立即执行的功能。的;在开始时防止在缩小之后潜在的语法错误。

函数本身提供了参数的作用域,而不是在全局范围内引用它们。它还提供了使用该函数定义的局部变量的隐私。 undefined传递的有些令人困惑的最终参数可防止对undefined在全局范围内表示的内容进行恶意更改。

如果你谷歌的javascript术语,如自我执行功能,全局范围,闭包,模块模式,可用的资源很多。


包含您无法使用的代码副本可能会有所帮助。

但是回答关于为什么if($('ul.mtree').length)可以在控制台返回true的问题,但页面中的false可能取决于时间(例如,在DOM加载之前执行该函数)。当您加载控制台以检查值时,将加载DOM并返回true。

确保在页面末尾包含JS,或者仅在文档加载后调用。


如果我正确理解你的问题,在函数语句之前的符号;的功能,如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(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');
}();

你会看到符号,例如'()',' - ','+','?','!'

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

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


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

1
2
3
4
5
(function() {
var window = 123,
    document = 'abc',
    $ = Function.prototype;
})();

然后,

  • $jQuery和其他库使用的简写。代码假定jQuery没有被其他东西遮蔽,因此它创建了一个名为$的变量,其值为jQuery
  • this是关键字。如果未在非严格模式下显式设置,则它将成为全局对象。因此,您的代码会使用该值创建一个局部变量window。请注意,这很危险,因为this可能已设置为某个值,或者在严格模式下为undefined
  • 假设this是全局对象,this.document将是文档对象。
  • undefined是全局对象的一个??属性,它在ECMAScript 3中没有ReadOnly属性,因此可以覆盖它。您的代码创建一个局部变量而不分配任何值,因此它变为真正的未定义。因为window.undefined将[[Configurable]]和[[Writable]]属性设置为false,因此不再需要ECMAScript 5。

然后,

1
2
3
4
5
6
7
8
(function() {
var window = 123,
    document = 'abc',
    $ = Function.prototype;
    (function($, window, document, undefined) {
        // `$`, `window`, `document` and `undefined` have been restored
    })(jQuery, this, this.document);
})();