相关疑难解决方法(0)

JavaScript中的(function(){})()构造是什么?

我曾经知道这意味着什么,但我现在正在努力...

这基本上是说document.onload吗?

(function () {

})();
Run Code Online (Sandbox Code Playgroud)

javascript iife

739
推荐指数
13
解决办法
27万
查看次数

406
推荐指数
9
解决办法
12万
查看次数

解释封装的匿名函数语法

摘要

你能解释一下JavaScript中封装的匿名函数语法背后的原因吗?为什么这样做:(function(){})();但这不是:function(){}();


我知道的

在JavaScript中,可以创建一个这样的命名函数:

function twoPlusTwo(){
    alert(2 + 2);
}
twoPlusTwo();
Run Code Online (Sandbox Code Playgroud)

您还可以创建匿名函数并将其分配给变量:

var twoPlusTwo = function(){
    alert(2 + 2);
};
twoPlusTwo();
Run Code Online (Sandbox Code Playgroud)

您可以通过创建匿名函数来封装代码块,然后将其包装在括号中并立即执行:

(function(){
    alert(2 + 2);
})();
Run Code Online (Sandbox Code Playgroud)

这在创建模块化脚本时非常有用,可以避免使当前作用域或全局作用域混乱,并且可能存在冲突的变量 - 例如Greasemonkey脚本,jQuery插件等.

现在,我理解为什么会这样.括号包含内容并仅公开结果(我确定有更好的方法来描述),例如with (2 + 2) === 4.


我不明白

但我不明白为什么这也不起作用:

function(){
    alert(2 + 2);
}();
Run Code Online (Sandbox Code Playgroud)

你能解释一下吗?

javascript syntax anonymous-function

364
推荐指数
4
解决办法
7万
查看次数

围绕对象/函数/类声明的括号是什么意思?

我是JavaScript和YUI的新手.在YUI库示例中,您可以找到此构造的许多用法:

(function() {
    var Dom = YAHOO.util.Dom,
    Event = YAHOO.util.Event,
    layout = null,
        ...
})();
Run Code Online (Sandbox Code Playgroud)

我认为最后几个括号是在声明之后执行该函数.

...但是围绕函数声明的前一组括号怎么样?

我认为这是一个范围问题; 这是将内部变量隐藏到外部函数和可能的全局对象中.是吗?更一般地说,这些括号的机制是什么?

javascript syntax

286
推荐指数
6
解决办法
11万
查看次数

立即函数调用语法

有一个JSLint选项,实际上是一个好的部分,"[需要]围绕立即调用的parens,"意味着构造

(function () {

  // ...

})();
Run Code Online (Sandbox Code Playgroud)

反而需要写成

(function () {

  // ...

}());
Run Code Online (Sandbox Code Playgroud)

我的问题是 - 任何人都可以解释为什么第二种形式可能被认为更好?它更有弹性吗?不容易出错?它比第一种形式有什么优势?


自从提出这个问题以来,我逐渐理解了在函数值和函数值之间进行清晰视觉区分的重要性.考虑立即调用的结果是赋值表达式的右侧的情况:

var someVar = (function () {

  // ...

}());
Run Code Online (Sandbox Code Playgroud)

尽管最外面的括号在语法上是不必要的,但是左括号给出了一个预先指示,即所分配的值不是函数本身,而是调用函数的结果.

这类似于Crockford关于构造函数大写的建议 - 它可以作为任何查看源代码的人的视觉提示.

javascript syntax jslint iife

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

这个符号在JavaScript中意味着什么?

这是什么?

这是一系列关于JavaScript中语法的问题.这也是社区Wiki,因此邀请每个人参与维护此列表.

为什么是这样?

Stack Overflow不允许搜索特定字符.因此,在搜索运算符和其他语法标记时,很难找到许多关于运算符和其他语法标记的问题.这也使得关闭重复更加困难.以下列表是为了解决此问题.

主要思想是在Stack Overflow上链接现有问题,因此我们更容易引用它们,而不是复制ECMAScript规范中的内容.

此外,这是PHP符号引用的公然副本.我们需要一个JS.


请帮忙.编辑并添加指向其他运算符/语法参考的链接,或者如果您无法在特定语法上找到好的问题/答案,请添加此问题的答案并将其链接

javascript

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

jQuery单击/切换两个函数

我正在寻找一种方法,在点击某些内容时运行两个单独的操作/函数/"代码块",然后在再次单击相同的内容时运行完全不同的块.我把它放在一起.我想知道是否有更有效/更优雅的方式.我知道jQuery .toggle()但它有点糟糕.

在这里工作:http: //jsfiddle.net/reggi/FcvaD/1/

var count = 0;
$("#time").click(function() {
    count++;
    //even odd click detect 
    var isEven = function(someNumber) {
        return (someNumber % 2 === 0) ? true : false;
    };
    // on odd clicks do this
    if (isEven(count) === false) {
        $(this).animate({
            width: "260px"
        }, 1500);
    }
    // on even clicks do this
    else if (isEven(count) === true) {
        $(this).animate({
            width: "30px"
        }, 1500);
    }
});
Run Code Online (Sandbox Code Playgroud)

javascript jquery

71
推荐指数
6
解决办法
17万
查看次数

(...())与javascript闭包中的(...)()

我知道这很愚蠢,但这有什么区别:

(function() {  
    var foo = 'bar';  
})();
Run Code Online (Sandbox Code Playgroud)

还有这个?

(function() {  
    var foo = 'bar';  
}());
Run Code Online (Sandbox Code Playgroud)

JSLint告诉我们Move the invocation into the parens that contain the function,但我认为没有必要.

编辑:答案太酷了.~function,JSHint的替代方案以及jQuery对(/***/)();Crockford的解释的偏好!我以为我会得到一个"他们是同一件事"的答案.
你们通过upvotes决定最好的一个,我勾选它.

javascript comparison closures jslint anonymous-function

63
推荐指数
3
解决办法
4900
查看次数

这种做法在JavaScript中被称为什么?

当您将JavaScript代码包装在这样的函数中时:

(function(){

  var field = ...;
  function doSomthing(){...
  ...


})();
Run Code Online (Sandbox Code Playgroud)

我注意到这在很多网页上为我修复了范围问题.这种做法叫做什么?

javascript design-patterns terminology

57
推荐指数
5
解决办法
4057
查看次数

javascript中的init函数及其工作原理

我经常看到以下代码:

(function () {
  // init part
})();
Run Code Online (Sandbox Code Playgroud)

但我永远无法理解它是如何运作的.我发现最后一个括号特别令人困惑.有人可以解释它在执行上下文(EC)和变量对象(VO)方面的工作原理吗?

javascript

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