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

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

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

阅读 5.3k
8 个回答

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

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

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

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

()

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

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

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

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

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

第一个其实就是

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");
}()
*function jam(){
console.log("ok");
}()

纠正一下写法

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

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

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

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

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