前回setTimeoutでthisが動かないーなこと書きましたが
forEachとsomeまで動かないことが判明・・・
対策がsetTimeoutよりは楽だったけど書き直しがめんどくさい
forEachとsomeまで動かないことが判明・・・
対策がsetTimeoutよりは楽だったけど書き直しがめんどくさい
setTImeout同様関数を渡して実行させる場合、実行する場所がグローバルになるのでまたもthisが別のところを指してることになってました
(array.some(function(e){console.log(x);}); は1って表示されます)
someやforEachが終わったあとででローカル変数に入れておいたのをthisの要素にコピーすればOKです
func.prototype = {対策は、someやforEachのに渡す関数はsomeやforaEachがある場所のローカル変数にアクセスできるということを使ってthisを使ってアクセスしたいものをローカル変数にコピーしておきます
a : 10,
f : function(){
array = [1,2,3];
var x = 1;
array.some(function(e){this.a = 100;}); // this.aがないよってエラー
}
} ;
(array.some(function(e){console.log(x);}); は1って表示されます)
someやforEachが終わったあとででローカル変数に入れておいたのをthisの要素にコピーすればOKです
配列の場合は参照なのでコピーする必要はないです
func.prototype = {a : 10,ar : [1,2],f : function(){array = [1,2,3];var x = this.a;var xr = this.ar;array.some(function(e){x += 100; xr[1]+=100;});this.a = x; // これないとthis.aは変更されない// this.ar = xr; // arは配列なのでいらない}} ;
**追記
someやforEachで渡した関数内でthisを使う関数を実行するときにまた問題が出たので修正版
someやforEachで渡した関数内でthisを使う関数を実行するときにまた問題が出たので修正版
func.prototype = {a : 10,ar : [1,2],func: function(arg){console.log(arg);},f : function(){array = [1,2,3];var _this = this;array.some(function(e){
_this.a += 100;
_this.ar[1]+=100;
_this.func.call(_this,"abc");
});}} ;
_thisでthis自体を受け取ってるので後でthis.aを書き換える必要がなく、
関数を呼ぶときもcallを使って_thisを渡しているのでちゃんと動きます
--
前回のsetTimeoutを少し改良して使いやすくしたものをjsファイルにしましたー
http://blog.livedoor.jp/netomemo/js/setTimeoutThis.js
<script src="setTimeoutThis.js"></script>な感じで読み込んで
setTImeoutでthisを使うクラスのメソッドとしてsetTimeout = setTimeoutThis;を書いておけばOKです
できる限り元と同じ使い方をできるようにしてみました
関数を呼ぶときもcallを使って_thisを渡しているのでちゃんと動きます
--
前回のsetTimeoutを少し改良して使いやすくしたものをjsファイルにしましたー
http://blog.livedoor.jp/netomemo/js/setTimeoutThis.js
<script src="setTimeoutThis.js"></script>な感じで読み込んで
setTImeoutでthisを使うクラスのメソッドとしてsetTimeout = setTimeoutThis;を書いておけばOKです
できる限り元と同じ使い方をできるようにしてみました
コメントする