立即调用的函数表达式的用法

function createFunctions(){

    var result=new Array();
    for(var i=0;i<10;i++){
        result[i]= function(){
            return i;
            }();   
    }
    return result;
}
var arr=createFunctions();
alert(arr);//[0,1,2,……,9]

我想立即调用匿名函数来给result[index]赋值,网上查阅其中有几种方法是:

  1. !function(){ // do something }();

  2. ~function() {}();

  3. +function() {}();

  4. -function() {}()

有人说function(){return i; }();会提示语法错误
实际情况是function(){return i; }();并没有提示错误。而function前面添加+-!~会改变匿名函数返回值
(1)请问可以使用function(){return i; }()的格式来完成立即调用吗??
(2)如果匿名函数不是立即执行的,那么它会在什么时刻被执行??
(3)匿名函数声明的变量怎样才能被销毁?在什么时候才会被销毁?

阅读 2.9k
3 个回答

具体应该说是result= function(){//dosomething}();不会有语法错误吧,function(){//dosomething}();单独执行还是有语法错误的。

result=
  1. function(){//dosomething}();
    2.!function(){ // do something }();
    3.~ function() {}();
    4.+ function() {}();
    5.- function() {}()

原理是语句function(){//dosomething}()都被当作表达式处理了(赋值前计算表达式的值),就是2、3、4、5例可以自执行,自执行的原因也是function(){//dosomething}()由于前面的符号被当作表达式处理了。
至于result= function(){//dosomething}();不会有语法错误就是因为赋值语句把右边的function(){//dosomething}()当作表达式处理了,然后将结果赋给result。

单独调用

function(){return 1; }();
// VM263:2 Uncaught SyntaxError: Unexpected token (

是会报错的

一般可以通过把匿名函数变成立即调用的函数表达式,例如

var f = function() {}();
+function(){ return 1; }()
(function(){ return 1; })()
...

显然,你已经把匿名函数转成立即调用的函数表达式了。

具体参考: http://www.zhihu.com/question/20249179

;(function({
//do

}))();

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题