这个javascript符号是什么?

这个javascript符号是什么?,javascript,jquery,Javascript,Jquery,我找到了 这是我第一次看到这样的东西。它是什么以及如何解释?我不明白为什么它必须通过this和this.document,以及“undefined”是什么意思 我问这个问题的原因是因为我把它包括在我的页面和 if($('ul.mtree').length) 返回false,尽管在控制台中键入时返回true。第一个分号将以下代码与前面可能忘记分号的任何其他代码区分开来。这一点很重要,因为如果没有找到分号,paren将尝试将前面的语句作为函数运行 对于代码的其余部分,我们只是声明一个“内联”函

我找到了


这是我第一次看到这样的东西。它是什么以及如何解释?我不明白为什么它必须通过this和this.document,以及“undefined”是什么意思

我问这个问题的原因是因为我把它包括在我的页面和

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

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

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

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

阅读有关“保护$Alias并添加作用域”的详细信息

从OP更新

对于返回false的
if
语句,请确保在调用
if
语句时加载了html。一种快速的方法是将其包装在
$(文档)中。ready
方法如下:

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

这是一个立即执行的函数。这个在开始时,可防止缩小后出现潜在的语法错误

函数本身提供了参数的作用域,而不是在全局范围内引用它们。它还提供了使用函数定义的局部变量的隐私。传递的
undefined
的最后一个参数有些混乱,它可以防止对全局范围内未定义的内容进行恶意更改


如果您在谷歌上搜索javascript术语,如自执行函数、全局作用域、闭包、模块模式等,可以获得大量资源。

该代码可能会修复
$
窗口
文档
被其他值遮挡的情况:

(function() {
var window = 123,
    document = 'abc',
    $ = Function.prototype;
})();
那么

  • $
    jQuery
    和其他库使用的速记。代码假定
    jQuery
    没有被其他东西遮挡,因此它创建了一个名为
    $
    的变量,其值为
    jQuery
  • 这是一个关键字。在非严格模式下未显式设置时,它将成为全局对象。因此,您的代码使用该值创建一个局部变量
    窗口
    。注意这是危险的,因为
    可能已设置为某个值,或者在严格模式下未定义
  • 假设
    this
    是全局对象,
    this.document
    将是文档对象
  • undefined
    是全局对象的一个属性,它在ECMAScript 3中没有ReadOnly属性,因此它可以被覆盖。您的代码在不指定任何值的情况下创建局部变量,因此它成为真正的未定义变量。自从ECMAScript 5以来,不再需要该属性,因为
    窗口。未定义的
    将[[Configurable]]和[[Writable]]属性设置为
    false
那么


包含一份不起作用的代码副本可能会有所帮助

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


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

如果我正确理解您的问题,则注释的功能
在函数语句之前,例如

(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');
}();
您将看到符号,例如“()”、“-”、“+”、“~”、“!”

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


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

@ZachLeighton,这个问题有点让人困惑,但我想George是在问jquery文档加载的问题。我不明白为什么它必须传递这个和这个。文档,“undefined”@NathanKoop很好,我很快看了看,发现分号是这样的。related@GeorgeIrimiciuc请用这些信息更新这个问题,只是想提一下:它对js代码的缩略有很大帮助。是的!很好的一点@Royinamiraso:你忘了提到undefined可以被用户代码覆盖(我不认为现在是这样),但是最安全的做法是不向变量发送任何内容,这样你就可以确定它有未定义的值。关于未定义的
,我错过了。ready文档没有解决这个问题,这是因为该示例使用的是旧版本的velocity。而且当前版本不包括该函数(对于可能希望运行该示例的每个人来说)。关于
未定义的
的调用很好。我没有注意到。在OPGood调用中包含“文档加载”语法可能会有帮助,我最初忽略了它,因为我不想对OP的代码做任何假设。我会在中编辑它,但看起来您已经编辑了答案以包含一个示例,所以我将不使用我的语法来限制重复。
(function() {
var window = 123,
    document = 'abc',
    $ = Function.prototype;
    (function($, window, document, undefined) {
        // `$`, `window`, `document` and `undefined` have been restored
    })(jQuery, this, this.document);
})();
(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');
}();