我在JQuery中注意到使用了以下代码结构
(function(){var l=this,g,y=l.jQuery,p=l.$,...})()
这似乎创建了一个功能,并称之为.
采用这种方法与内联函数的内容相比有什么好处?
假设我有以下对象数组:
var arr = [
{"name": "John", "score": "8.8"},
{"name": "John", "score": "8.6"},
{"name": "John", "score": "9.0"},
{"name": "John", "score": "8.3"},
{"name": "Tom", "score": "7.9"}
];
var count = 0;
var avgScore = arr.reduce(function (sum,person) {
if (person.name == "John") {
count+=1;
return sum + parseFloat(person.score);
}
return sum;
},0)/count);
Run Code Online (Sandbox Code Playgroud)
问题:有没有办法在不创建全局计数变量的情况下计算"John"的平均分数.理想情况下,计数将在arr.reduce中的匿名函数内部.
您好我一直忙于试图把我的jQuery知识到一个新的水平,到目前为止,我想我已经明白了一切但是如我斗胆到更高级教程我注意到几个实例,其中JQuery的程序包在一个闭包(见下文)然而,令我困惑的是它传递$并返回JQuery.我的问题是为什么?我可以用返回的JQuery做什么?
我真的很感激人们可以为我提供的任何亮点.
(function($){
$(document).ready(function(){
var arr = $.map($("LI"), function(item, index){
while (index < 3)
{
return $(item).html();
}
return null;
});
$(document.body).append("<span>The first three authors are: " +
arr.join(", ") + "</span>");
});
})(jQuery);
Run Code Online (Sandbox Code Playgroud)
先感谢您.
抢
通常在阅读JavaScript源代码时,我会在顶部看到这两行.
/* jshint globalstrict: true */
'use strict';
Run Code Online (Sandbox Code Playgroud)
现在,我很清楚的目的'use strict';.有人可以告诉我为什么jshint globalstrict包括在内?
我的问题非常类似于javascript中自执行函数的目的是什么?,但是它涉及用户脚本(特别是针对 GreaseMonkey)。
我看到有些用户脚本是用这种模式分发的,有些则不是。
具有 IIFE 模式的脚本示例:(来源)
// ==UserScript==
// (...)
// ==/UserScript==
(function(){
// if <condition>
document.location.href += '?sk=h_chr';
// ...
})();
Run Code Online (Sandbox Code Playgroud)
没有它的脚本示例:(来源)
// ==UserScript==
// (...)
// ==/UserScript==
window.location.href = "https://www.facebook.com/?sk=h_chr";
Run Code Online (Sandbox Code Playgroud)
此外,我还发现 TamperMonkey 的“新脚本”模板遵循它,而 GreaseMonkey 和 ViolentMonkey 的模板没有。
那么问题是,IIFE 模式在编写用户脚本时有用吗?
特别是,如果我的脚本处于strictmode,并且我使用let而不是var. 无论如何,据我所知,用户脚本中定义的函数和变量在全局页面范围内不可用。
谢谢。
javascript userscripts tampermonkey ecmascript-6 greasemonkey-4
在查看SlickGrid源代码时,我遇到了以下模式:
(function ($) {
var SlickEditor = {
TextCellEditor: function (args) {
...
},
LongTextCellEditor: function (args) {
...
}
};
$.extend(window, SlickEditor);
})(jQuery);
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,它使用立即调用来定义各种函数对象,然后将它们合并到全局命名空间中.
所以我可以像这样全局定义我的函数,它会产生相同的效果,对吧?
function TextCellEditor (args) {
...
}
function LongTextCellEditor (args) {
...
}
Run Code Online (Sandbox Code Playgroud)
我能看到的唯一区别是,在第一个版本中,我可以用$速记来引用该jQuery对象.除此之外,两种情况下的结果都是相同的.
我想知道我是否遗漏了什么.也许还有另外一个很好的理由这样做?
更新:请注意,我意识到使用这种立即调用模式允许使用匿名函数中声明的私有变量.但是在这种情况下没有声明任何变量,并且函数无论如何都被注入到全局范围中.所以我还是想知道是否有任何真正的区别.
一些答案指出,引用局部变量比引用全局变量要快得多.如果我$从TextCellEditor()构造函数中引用,这仍然适用.因为它是在外部匿名函数的范围内定义的,所以它$不是本地的TextCellEditor().
所有评论赞赏.
可能重复:
javascript中自执行函数的目的是什么?
JS中的meens编写如下代码:
(function (window) { })(window);
Run Code Online (Sandbox Code Playgroud)
或这个:
(function () { })();
Run Code Online (Sandbox Code Playgroud) 我正在研究一些代码,其中给定页面有许多与之关联的.js文件(利用它们像库一样).每个.js文件都在里面看起来像这样:
(function() {
.... all the lib functions and objects ....
})();
Run Code Online (Sandbox Code Playgroud)
经过一些游戏后,我看到了格式的函数(function(){...})(); 自动调用.如果我剥离外部paren的函数(){...},那么代码无效.如果我添加一个函数名,那么代码是有效的,但在调用函数foo(){...}之前不会运行.
lib是以这种方式编写的特殊原因吗?我猜它会封装变量名等.它的语法是什么允许它在页面加载时自动运行?
为什么在js上做出这种糟糕的设计?是否有任何特殊原因设计这样的自动分号插入?
这是我的代码,它在chrome中的js中不起作用:
(function(){console.log("abc");})()
(function(){console.log("123");})();
Run Code Online (Sandbox Code Playgroud)
这是错误:
Uncaught TypeError: (intermediate value)(...) is not a function
Run Code Online (Sandbox Code Playgroud)
我知道这段代码的正确版本是:
(function(){console.log("abc");})();
(function(){console.log("123");})();
Run Code Online (Sandbox Code Playgroud)
我只是想知道为什么js语法设计得如此愚蠢.历史原因?
我也添加这个问题作为警告,每个人都尝试使用javascript的自动分号插入,请只需添加;它需要的任何地方,javascript的自动分号插入是垃圾.它没有像你期望的那样工作.
现有的答案对我来说太复杂了,所以我问一个新答案:
另一个看起来不错但不是工作案例2:
x=1
(function(){console.log("123");})()
Run Code Online (Sandbox Code Playgroud) javascript ×9
function ×2
jquery ×2
closures ×1
ecmascript-6 ×1
jshint ×1
reduce ×1
syntax ×1
tampermonkey ×1
userscripts ×1