84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
function jam(){ console.log("ok"); }()
jamlee 2015/2/14 22:49:11 (function jam(){ console.log("ok"); }())
业精于勤,荒于嬉;行成于思,毁于随。
@公子 答案没说清楚,js中的分隔符就是任意的空白符,像是空格,tab,换行等都算,你有一个还是两个没影响。
正确的解释是应该函数表达式与函数声明的区别。
详细的解释还是看看这里:http://stackoverflow.com/questions/1634268/explain-javascripts-encapsulated-anonymous-function-syntax/1634321#1634321
实际上,第一种写法会抛出SyntaxError。
SyntaxError
在 JavaScript 代码解析的时候,如果碰到 function 开头的语句,默认为认为这是一个函数声明。所以在编译器看来,上述的代码就是:
function
function jam(){ console.log("ok"); } ()
也就是说,在编译器看来,这个语句做了两件事情:
jam()
()
声明函数是合法的,但是使用()运算符时出错了。 在 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(){console.log(123)})()
首先你要定义一个函数,于是你会这么写: function jam() {}; 其实这是 js 里的一种语法糖,它等价于: var jam = function() {}; 然后你想执行这个函数,脑洞大开的人会这么写: function jam() {}(); 但是这么写就报错了,其实这种写法也不算错,因为它确实是 js 支持的函数表达式,但是同时 js 又规定以 function 开头的语句被认为是函数语句,而函数语句后面是肯定不会带 () 的,所以才报错,于是聪明的人想出来,加上一对括号就可以了。于是就变成了这样: (function jam() {}()) 详情参加 ECMAScript 的 Expression Statement 章节:链接描述
这是两种不同的函数形式,第一种是函数定义式,第二种是函数的自执行,后面的圆括号用来执行函数。而且一般都是匿名函数采取的。其实是这样的:()()第一个括号包裹整个函数,而第二个圆括号用来执行函数的
()()
@公子 答案没说清楚,js中的分隔符就是任意的空白符,像是空格,tab,换行等都算,你有一个还是两个没影响。
正确的解释是应该函数表达式与函数声明的区别。
详细的解释还是看看这里:
http://stackoverflow.com/questions/1634268/explain-javascripts-encapsulated-anonymous-function-syntax/1634321#1634321
实际上,第一种写法会抛出
SyntaxError
。在 JavaScript 代码解析的时候,如果碰到
function
开头的语句,默认为认为这是一个函数声明。所以在编译器看来,上述的代码就是:也就是说,在编译器看来,这个语句做了两件事情:
jam()
函数()
运算符声明函数是合法的,但是使用
()
运算符时出错了。 在 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() {};
其实这是 js 里的一种语法糖,它等价于:
var jam = function() {};
然后你想执行这个函数,脑洞大开的人会这么写:
function jam() {}();
但是这么写就报错了,其实这种写法也不算错,因为它确实是 js 支持的函数表达式,但是同时 js 又规定以 function 开头的语句被认为是函数语句,而函数语句后面是肯定不会带 () 的,所以才报错,于是聪明的人想出来,加上一对括号就可以了。于是就变成了这样:
(function jam() {}())
详情参加 ECMAScript 的 Expression Statement 章节:链接描述
function
关键字作为一句话的开头的函数,而任何不以function
开头的(只限在一句话内)函数,都是函数表达式。()
来自执行,而函数表达式则可以。这是两种不同的函数形式,第一种是函数定义式,第二种是函数的自执行,后面的圆括号用来执行函数。而且一般都是匿名函数采取的。其实是这样的:
()()
第一个括号包裹整个函数,而第二个圆括号用来执行函数的