0-9
「コードを後ろまで読まないと処理内容が確定しない」問題

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で使うのがいいと思う。

  1. ken0205syoichiからリブログしました
  2. qawsklpsyoichiからリブログしました
  3. knives777syoichiからリブログして、コメントを追加しました:
    JSは無名関数伸びだし方にいくつかあってよくあるのが(function () {})()だけど、この方法だとコードを最後まで読まないと処理内容が確定しないという問題がある。 (function () { /* この時点では処理内容は未確定...
  4. drmiyabisai10tからリブログしました
  5. tokujoushibiresyoichiからリブログしました
  6. sai10tsyoichiからリブログしました
  7. kskesyoichiからリブログしました
  8. donvrysyoichiからリブログしました
  9. knnrsyoichiからリブログしました
  10. ukaratm09tdからリブログしました
  11. cuted4qqtqhsyoichiからリブログしました
  12. orihikasyoichiからリブログしました
  13. osamuyasyoichiからリブログしました
  14. yysysyoichiからリブログしました
  15. athsearsyoichiからリブログしました
  16. hisuixsyoichiからリブログしました
  17. yamada123456789syoichiからリブログしました
  18. kosnsyoichiからリブログしました
  19. cr96syoichiからリブログしました
  20. hidkicksyoichiからリブログしました
  21. syoichi0-9からリブログしました
  22. atm09td0-9からリブログして、コメントを追加しました:
    最期まで読まないとfunction…
  23. 0-9の投稿です