search

Home  >  Q&A  >  body text

javascript - js下面的区别,一个可以执行,一个不行

function jam(){
console.log("ok");
}()

jamlee 2015/2/14 22:49:11
(function jam(){
console.log("ok");
}())

迷茫迷茫2912 days ago493

reply all(8)I'll reply

  • PHPz

    PHPz2017-04-10 14:58:58

    @公子 答案没说清楚,js中的分隔符就是任意的空白符,像是空格,tab,换行等都算,你有一个还是两个没影响。

    正确的解释是应该函数表达式与函数声明的区别。

    详细的解释还是看看这里:
    http://stackoverflow.com/questions/1634268/explain-javascripts-encapsulated-anonymous-function-syntax/1634321#1634321

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 14:58:58

    实际上,第一种写法会抛出SyntaxError

    function jam(){
    console.log("ok");
    }()
    

    在 JavaScript 代码解析的时候,如果碰到 function 开头的语句,默认为认为这是一个函数声明。所以在编译器看来,上述的代码就是:

    function jam(){
    console.log("ok");
    }
    
    ()
    

    也就是说,在编译器看来,这个语句做了两件事情:

    1. 声明了一个jam()函数
    2. 使用()运算符

    声明函数是合法的,但是使用()运算符时出错了。 在 JavaScript 中,()使用有两种场景,一种是作为函数调用符,一种是分隔表达式(提高优先级)。而上面这个代码中,无论哪个场景都不符合,所以抛出了一个语法错误。

    第二段代码是 立即执行的匿名函数表达式(IIFE)。

    更详细的可以参考这篇文章: [译] 立即执行函数表达式(IIFE)

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 14:58:58

    第一个其实就是

    function jam(){
        console.log("ok");
    }
    
    ()
    

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 14:58:58

    ~function jam(){
    console.log("ok");
    }()
    !function jam(){
    console.log("ok");
    }()
    +function jam(){
    console.log("ok");
    }()
    -function jam(){
    console.log("ok");
    }()
    *function jam(){
    console.log("ok");
    }()

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 14:58:58

    纠正一下写法

    ;!(function(){console.log(123)})()
    

    reply
    0
  • 阿神

    阿神2017-04-10 14:58:58

    首先你要定义一个函数,于是你会这么写:
    function jam() {};
    其实这是 js 里的一种语法糖,它等价于:
    var jam = function() {};
    然后你想执行这个函数,脑洞大开的人会这么写:
    function jam() {}();
    但是这么写就报错了,其实这种写法也不算错,因为它确实是 js 支持的函数表达式,但是同时 js 又规定以 function 开头的语句被认为是函数语句,而函数语句后面是肯定不会带 () 的,所以才报错,于是聪明的人想出来,加上一对括号就可以了。于是就变成了这样:
    (function jam() {}())
    详情参加 ECMAScript 的 Expression Statement 章节:链接描述

    reply
    0
  • 天蓬老师

    天蓬老师2017-04-10 14:58:58

    1. 这是js的声明式函数和函数表达式的区别,声明式函数是以function关键字作为一句话的开头的函数,而任何不以function开头的(只限在一句话内)函数,都是函数表达式。
    2. 函数声明不能通过直接在后面田间()来自执行,而函数表达式则可以。

    reply
    0
  • 迷茫

    迷茫2017-04-10 14:58:58

    这是两种不同的函数形式,第一种是函数定义式,第二种是函数的自执行,后面的圆括号用来执行函数。而且一般都是匿名函数采取的。其实是这样的:()()第一个括号包裹整个函数,而第二个圆括号用来执行函数的

    reply
    0
  • Cancelreply