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。
第一个分号
对于其余代码,我们只是声明一个"内联"函数,该函数将立即执行,其中参数
在此处阅读有关"保护$ Alias和添加范围"的更多信息
OP更新:
对于返回false的
1 2 3 4 5 | $(document).ready(function () { if($('ul.mtree').length) { alert("got 'em!"); } }); |
这是一个立即执行的功能。的;在开始时防止在缩小之后潜在的语法错误。
函数本身提供了参数的作用域,而不是在全局范围内引用它们。它还提供了使用该函数定义的局部变量的隐私。
如果你谷歌的javascript术语,如自我执行功能,全局范围,闭包,模块模式,可用的资源很多。
包含您无法使用的代码副本可能会有所帮助。
但是回答关于为什么
确保在页面末尾包含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'); }(); |
你会看到符号,例如'()',' - ','+','?','!'
并且表示法的功能是将函数语句解析为表达式并立即执行该函数!
但我建议你只使用'()'来执行函数语句,因为它是在例程中使用的正式方法和常规方法。
可能这个代码应该修复
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); })(); |