外部スコープから内部スコープを参照する
スコープ外から変数を書き換えることは不可能なので、予め内部に書き換える仕組みを作ってみてはどうでしょうか。
JavaScript
1var test = (function (a, b) {
2 function test () {
3 return a + b;
4 }
5
6 test.set = function set (_a, _b) {
7 a = _a;
8 b = _b;
9 };
10
11 return test;
12})(2, 3);
13
14test.set(4, 5);
15console.log(test()); // 9
このコードは深く考えずに書きましたが、筋の良い書き方とは私も思いません。
無名関数内に閉じ込められていたローカル変数 a
, b
がグローバルスコープから参照できるようになっているわけですが、
これは例えるなら、「ローカル変数がグローバル変数に化けている」ようなものだからです。
(代替案) インスタンスプロパティに値を代入する
後で書き換える意図があるならオブジェクト指向的に関数を定義するのが良いと思います。
JavaScript
1function Foo (a, b) {
2 this.a = a;
3 this.b = b;
4}
5
6Object.defineProperty(Foo.prototype, 'test', {
7 writable: true,
8 enumerable: false,
9 configurable: true,
10 value: function test () {
11 return this.a + this.b;
12 }
13});
14
15var foo = new Foo(2, 3);
16console.log(foo.test()); // 5
17foo.a = 4;
18foo.b = 5;
19console.log(foo.test()); // 9
getter, setter 的なプロパティを定義すれば更に複雑な動作も実現できます。
Re: tkow さん
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/10/12 15:46 編集