相关疑难解决方法(0)

在JavaScript中使用(function(){...})()有什么好处

我在JQuery中注意到使用了以下代码结构

(function(){var l=this,g,y=l.jQuery,p=l.$,...})()

这似乎创建了一个功能,并称之为.

采用这种方法与内联函数的内容相比有什么好处?

javascript closures anonymous-function

9
推荐指数
1
解决办法
1821
查看次数

如何使用javascript reduce函数计算满足特定条件的项目的平均值?

假设我有以下对象数组:

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中的匿名函数内部.

javascript reduce

9
推荐指数
1
解决办法
5356
查看次数

在闭包中包装jquery函数有什么好处?

您好我一直忙于试图把我的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)

先感谢您.

jquery

8
推荐指数
2
解决办法
1685
查看次数

"自我调用匿名函数"的目的

可能重复:
javascript中自执行函数的目的是什么?

希望非常直截了当的问题:

使用自调用匿名函数的目的是什么?是否只是为了防止用变量等"污染"全球范围?或者使用它们还有其他优点吗?

javascript function anonymous-function

7
推荐指数
1
解决办法
6833
查看次数

使用'use strict'的`jshint globalstrict:true`的目的

通常在阅读JavaScript源代码时,我会在顶部看到这两行.

/* jshint globalstrict: true */
'use strict';
Run Code Online (Sandbox Code Playgroud)

现在,我很清楚的目的'use strict';.有人可以告诉我为什么jshint globalstrict包括在内?

javascript jshint

6
推荐指数
1
解决办法
1013
查看次数

编写用户脚本时是否真的需要立即调用函数表达式 (IIFE) 模式?

我的问题非常类似于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

6
推荐指数
1
解决办法
708
查看次数

这种JavaScript立即调用模式的原因是什么?

在查看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 jquery design-patterns

5
推荐指数
1
解决办法
2715
查看次数

5
推荐指数
2
解决办法
5009
查看次数

只有在调用时,Javascript函数才会自动运行

我正在研究一些代码,其中给定页面有许多与之关联的.js文件(利用它们像库一样).每个.js文件都在里面看起来像这样:

(function() {
    .... all the lib functions and objects ....
})();
Run Code Online (Sandbox Code Playgroud)

经过一些游戏后,我看到了格式的函数(function(){...})(); 自动调用.如果我剥离外部paren的函数(){...},那么代码无效.如果我添加一个函数名,那么代码是有效的,但在调用函数foo(){...}之前不会运行.

lib是以这种方式编写的特殊原因吗?我猜它会封装变量名等.它的语法是什么允许它在页面加载时自动运行?

javascript

5
推荐指数
1
解决办法
1万
查看次数

为什么两个函数调用的括号之间的换行不被视为js中的两个语句?

为什么在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的自动分号插入是垃圾.它没有像你期望的那样工作.

现有的答案对我来说太复杂了,所以我问一个新答案:

/sf/answers/199240891/

另一个看起来不错但不是工作案例2:

x=1

(function(){console.log("123");})()
Run Code Online (Sandbox Code Playgroud)

javascript syntax

5
推荐指数
1
解决办法
94
查看次数