Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 5 years have 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);にラップされている
たぶん同じ理由なんだと思う

osakanafish
🐟
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away