11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

即時関数の様々な記法

Posted at

#functionの先頭に!だと…?
ある日、Twitterボタンを設置しようとしていた私は、ふいにそのソースコードを見て心がざわつきました。

<script>
!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');
</script>

ん??

!function(...){
	doSomething();
}(...);

functionの前に「!」が書いてあるぞ…。
いったい何者だこやつは…!

#即時関数だった
調べてみると、JSでよく見かける即時関数

(function(...){
	doSomething();
})(...);

の別記法でした。

#他にも…
他にもこんな書き方ができるようです。

+function(...){
	doSomething();
}(...)
-function(...){
	doSomething();
}(...)
void function(...){
	doSomething();
}(...)
typeof function(...){
	doSomething();
}(...)

そもそも( )を使う必要性すらないわけですね。

#なぜこの書き方ができるの?
詳しい説明は割愛しますが、ポイントは関数を「式 Expression」として解釈させることにあります。

JSの処理系に関数を式として解釈させるには、「式文 ExpressionStatement」と呼ばれる文法にのっとる必要があります。

ECMAScriptの仕様書には


ExpressionStatement :
	[lookahead  {{, function}] Expression ;

/* 先頭が { もしくは function で始まらないこと */

とあるので、冒頭の「!」で始まるfunctionは関数式として解釈され、実行されるというわけです。

#参考リンク

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?