JSは無名関数伸びだし方にいくつかあってよくあるのが(function () {})()だけど、この方法だとコードを最後まで読まないと処理内容が確定しないという問題がある。
(function () {
/* この時点では処理内容は未確定 */
})();// ここまで読んでようやく実行されることが確定する
基本的には「(function」で始まってれば大抵「})();」で終わるのでそこまで問題じゃないけど、こういうコードだと結構困る。
var hoge = (function () {
/* 最期まで読まないとfunction objectをhogeに保持したいのか、無名関数を実行した結果をhogeに保持したいのかわからない */
})();
この点、new function () {}は最初の「new function」時点で「functionが実行される」ことが確定するので最期まで読まなくても処理内容が確定する。
new function () {
/* この中は必ず実行されるので安心 */
};
ただ、new function方式には「object以外返せない」という欠点があるので、単純な無名関数の実行以外では使いにくい。
(@asu_re さんに「new function (a) {}(1);で引数を渡せる」との指摘をもらったので修正)
注意点として(function () {})()で引数を使うと「コードを後ろまで読まないと処理内容が確定しない」問題が発生してしまうので使わないほうがいい。
また、実効速度としては(function () {})()の方が早いので、「”(function”で始めた場合、必ず”})()”で閉じる」、「長い(function () {})()に引数を使わない」、「(function () {}).call()、(function () {}).apply()でのthis変更禁止(これも「コードを後ろまで読まないと処理内容が確定しない」問題があるから)」をルールとして決めるといい。
function callのベンチマーク - jsdo.it - share JavaScript, HTML5 and CSS
「コードを後ろまで読まないと処理内容が確定しない」問題はFunction.bindとかFunction.proxyにもあるので、個人的にはこの方法でのthis変更もあまり推奨しない。
この点$.proxyは先に「$.proxy」が来ることで最期まで読まなくても「thisが書き換えられている」ことがわかるのでいい。
ただ、「なんのthisに書き換えられているのか」はやっぱり最期まで読まないと確定しないので困る。
基本的には上位のfunction内でthisを束縛し、中のfunctionで使うのがいいと思う。
-
kentarotsudaがこの投稿を「スキ!」と言っています
-
ken0205がsyoichiからリブログしました
-
qawsklpがこの投稿を「スキ!」と言っています
-
qawsklpがsyoichiからリブログしました
-
knives777がsyoichiからリブログして、コメントを追加しました:
JSは無名関数伸びだし方にいくつかあってよくあるのが(function () {})()だけど、この方法だとコードを最後まで読まないと処理内容が確定しないという問題がある。 (function () { /* この時点では処理内容は未確定...
-
y-uがこの投稿を「スキ!」と言っています
-
aaharuがこの投稿を「スキ!」と言っています
-
drmiyabiがsai10tからリブログしました
-
tokujoushibireがsyoichiからリブログしました
-
sai10tがsyoichiからリブログしました
-
kskeがsyoichiからリブログしました
-
donvryがsyoichiからリブログしました
-
knnrがsyoichiからリブログしました
-
ukarがatm09tdからリブログしました
-
cuted4qqtqhがsyoichiからリブログしました
-
orihikaがsyoichiからリブログしました
-
osamuyaがsyoichiからリブログしました
-
yysyがsyoichiからリブログしました
-
athsearがsyoichiからリブログしました
-
hisuixがsyoichiからリブログしました
-
yamada123456789がsyoichiからリブログしました
-
kosnがsyoichiからリブログしました
-
cr96がsyoichiからリブログしました
-
hisuihaneがこの投稿を「スキ!」と言っています
-
tommbyがこの投稿を「スキ!」と言っています
-
hizayamasanがこの投稿を「スキ!」と言っています
-
hidkickがこの投稿を「スキ!」と言っています
-
hidkickがsyoichiからリブログしました
-
syoichiが0-9からリブログしました
-
fingaholicがこの投稿を「スキ!」と言っています
-
atm09tdが0-9からリブログして、コメントを追加しました:
最期まで読まないとfunction…
-
0-9の投稿です