标签: anonymous-function

为什么需要在同一行上调用匿名函数?

我正在阅读一些关于闭包的帖子,到处都看到了这个,但是没有明确的解释它是如何工作的 - 每次我被告知要使用它......:

// Create a new anonymous function, to use as a wrapper
(function(){
    // The variable that would, normally, be global
    var msg = "Thanks for visiting!";

    // Binding a new function to a global object
    window.onunload = function(){
        // Which uses the 'hidden' variable
        alert( msg );
    };
// Close off the anonymous function and execute it
})();
Run Code Online (Sandbox Code Playgroud)

好的,我看到我们将创建新的匿名函数,然后执行它.所以在那之后这个简单的代码应该工作(并且确实如此):

(function (msg){alert(msg)})('SO');
Run Code Online (Sandbox Code Playgroud)

我的问题是这里发生了什么样的魔术?当我写作时我想:

(function (msg){alert(msg)})
Run Code Online (Sandbox Code Playgroud)

然后会创建一个新的未命名函数,如函数""(msg)...

但那么为什么这不起作用?

(function (msg){alert(msg)});
('SO');
Run Code Online (Sandbox Code Playgroud)

为什么它需要在同一行?

你能指点一些帖子或给我解释一下吗?

javascript anonymous-function iife

372
推荐指数
8
解决办法
29万
查看次数

解释封装的匿名函数语法

摘要

你能解释一下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万
查看次数

匿名递归PHP函数

是否可以使用递归和匿名的PHP函数?这是我试图让它工作,但它没有传递函数名称.

$factorial = function( $n ) use ( $factorial ) {
    if( $n <= 1 ) return 1;
    return $factorial( $n - 1 ) * $n;
};
print $factorial( 5 );
Run Code Online (Sandbox Code Playgroud)

我也知道这是实现阶乘的一种不好的方法,它只是一个例子.

php recursion lambda closures anonymous-function

190
推荐指数
3
解决办法
3万
查看次数

javascript:递归匿名函数?

假设我有一个基本的递归函数:

function recur(data) {
    data = data+1;
    var nothing = function() {
        recur(data);
    }
    nothing();
}
Run Code Online (Sandbox Code Playgroud)

如果我有匿名功能,我怎么能这样做...

(function(data){
    data = data+1;
    var nothing = function() {
        //Something here that calls the function?
    }
    nothing();
})();
Run Code Online (Sandbox Code Playgroud)

我想要一种方法来调用调用这个函数的函数...我已经看到某个地方的脚本(我记不清哪里)可以告诉你一个被调用的函数的名字,但我记不起任何一个那个信息现在.

javascript recursion scope anonymous-function

112
推荐指数
7
解决办法
6万
查看次数

用于自动执行匿名JavaScript函数的括号的位置?

我最近将当前版本的json2.js与我在项目中的版本进行了比较,并注意到函数表达式的创建和自我执行方式有所不同.

用于在括号中包装匿名函数然后执行它的代码,

(function () {
  // code here
})();
Run Code Online (Sandbox Code Playgroud)

但现在它将自动执行的函数包含在括号中.

(function () {
  // code here
}());
Run Code Online (Sandbox Code Playgroud)

有通过CMS在接受答案的注释解释JavaScript的封装匿名函数的语法是"既:(function(){})();(function(){}());有效."

我想知道有什么区别?前者是否通过绕过全局匿名函数来占用内存?括号应该放在哪里?

javascript syntax anonymous-function iife

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

在JSON结果中定义函数是否有效?

网站的JSON响应的一部分有这个(...为上下文添加):

{..., now:function(){return(new Date).getTime()}, ...}
Run Code Online (Sandbox Code Playgroud)

向JSON添加匿名函数是否有效?我希望每次你访问"时间"返回一个不同的值.

json anonymous-function

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

JavaScript中的匿名函数的removeEventListener

我有一个包含方法的对象.这些方法被放入匿名函数内的对象中.它看起来像这样:

var t = {};
window.document.addEventListener("keydown", function(e) {
    t.scroll = function(x, y) {
        window.scrollBy(x, y);
    };
    t.scrollTo = function(x, y) {
        window.scrollTo(x, y);
    };
});  
Run Code Online (Sandbox Code Playgroud)

(还有更多代码,但这足以显示问题)

现在我想在某些情况下停止事件监听器.因此我试图做一个removeEventListener,但我无法弄清楚如何做到这一点.我在其他问题中已经读过,无法在匿名函数上调用removeEventListener,但在这种情况下是否也是如此?

我在匿名函数中创建了一个方法,因此我认为这是可能的.看起来像这样:

t.disable = function() {
    window.document.removeEventListener("keydown", this, false);
}
Run Code Online (Sandbox Code Playgroud)

为什么我不能这样做?

还有其他(好的)方法吗?

奖金信息; 这只需要在Safari中工作,因此缺少即支持.

javascript safari anonymous-function dom-events

90
推荐指数
7
解决办法
8万
查看次数

为何使用命名函数表达式?

我们有两种不同的方式在JavaScript中进行函数表达式:

命名函数表达式(NFE):

var boo = function boo () {
  alert(1);
};
Run Code Online (Sandbox Code Playgroud)

匿名函数表达式:

var boo = function () {
  alert(1);
};
Run Code Online (Sandbox Code Playgroud)

并且可以调用它们boo();.我真的不明白为什么/什么时候我应该使用匿名函数,何时我应该使用命名函数表达式.他们之间有什么区别?

javascript function anonymous-function function-expression

90
推荐指数
2
解决办法
2万
查看次数

如何使用参数传递对函数的引用?

可能重复:
如何在JavaScript函数调用中预先设置参数?(部分功能应用)

我需要能够使用给定的参数集传递对函数的引用.

以下是传递不带参数的引用的示例:

var f = function () {
    //Some logic here...
};

var fr = f; //Here I am passing a reference to function 'f', without parameters
fr(); //the 'f' function is invoked, without parameters
Run Code Online (Sandbox Code Playgroud)

现在我需要做的是传递相同的f函数,但这次我需要将参数传递给引用.现在,我可以使用匿名函数来执行此操作,并f使用新创建的函数内的参数调用函数,如下所示:

var f = function () {
        //Some logic here...
    };

var fr = function (pars) {
    f(pars);
}; //Here I am creating an anonymous function, and invoking f inside it

fr({p : 'a …
Run Code Online (Sandbox Code Playgroud)

javascript anonymous-function pass-by-reference

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

如何使用匿名函数removeEventListener作为addEventListener?

function doSomethingWith(param)
{
    document.body.addEventListener(
        'scroll',
        function()
        {
            document.write(param);
        },
        false
    ); // An event that I want to remove later
}
setTimeout(
    function()
    {
        document.body.removeEventListener('scroll', HANDLER ,false);
            // What HANDLER should I specify to remove the anonymous handler above?
    },
    3000
);
doSomethingWith('Test. ');
Run Code Online (Sandbox Code Playgroud)

javascript anonymous-function event-handling

85
推荐指数
3
解决办法
9万
查看次数