1. Qiita
  2. Items
  3. JavaScript

即時関数をcall(this)で呼ぶことについて

  • 52
    Like
  • 0
    Comment
More than 1 year has passed since last update.

即時関数あれこれ

JavaScriptの即時関数はいろんな書き方が出来る

// よく見かける即時関数
(function () {
  // ...
})();

// underscore.jsの即時関数
(function () {
  // ...
}).call(this);

underscore.jsの即時関数

underscore.jsは何故callで関数を呼び出しているのかというと
JavaScripstのstrictモードでは関数内のthisundefinedになる

e.g.
'use strict';

// よく見かける即時関数
(function () {
  console.log(this); // undefined
})();

// underscore.jsの即時関数
(function () {
  console.log(this); // 即時関数の外のthisが表示される
}).call(this);

strictモードでない場合はどちらの記述でも関数内のthisは実行時のthisが引き渡されるので
strictモードとそうでない場合の振る舞いの違いを吸収するため
call(this)で無名関数を呼んでいるのだと思われる

蛇足

grunt-contrib-coffeeなどでCoffeeScriptから変換されるJavaScriptも(function () {}).call(this);にラップされている
たぶん同じ理由なんだと思う