5

だから、私はこのようなことをしたいです:

    var a = 'a';

    var dummy = function() {

        // Print out var 'a', from the scope above
        console.log('Dummy a: ' + a);

        // Print out 'b', from the 'compelled' scope
        console.log('Dummy b: ' + b);
    }

    (function() {

        var b = 'otherscope';

        // I know apply won't work, I also don't want to merge scopes
        dummy.apply(this);

        // I want something like this:
        dummy.compel(this, [], {b: 'injected!'});

    })();

しかし、それはうまくいきません。

関数が2つのスコープに到達できるようにしたくはありません。ダミー関数の内部で使用される「b」変数を、外部から設定できるようにしたいのです。

4

3 に答える 3

6

b関数のパラメーターまたはグローバル変数を作成できます。

var a = 'a';
var dummy = function(b) {
   ...
}

また

var a = 'a';
var b;
var dummy = function() {
   ...
}

1 つ目はダミー関数がいつ変数にアクセスできるかを選択でき、2 つ目はどこからでもアクセスできるようにします。

于 2013-03-21T19:17:27.273 に答える
3

だから、私はそのようなことを行うための少し速い方法を見つけました:

var C = function(ctx, funcBody){
        var newBody = [];

        for(var k in ctx){
            var i =  "var "+k + " = ctx['"+k+"'];";
            newBody.push(i);
        }
        var res = "return function(t){ " +funcBody+ " }";
        newBody.push(res);
        var F = new Function("ctx", newBody.join('\n'));
        return F(ctx);
}
var newFunction = C({"foo":10, "bar":100}, "return foo+bar*t")
newFunction(50);
于 2015-04-24T11:55:04.780 に答える
2

これを使って:

Function.prototype.applyVars = function(scope, params, scope_variables) {
  if (scope_variables) {
    var variable, defVars = [];
    for (variable in scope_variables) {
      if (scope_variables.hasOwnProperty(variable)) {
        defVars.push(variable + '=scope_variables["' + variable + '"]');
      }
    }
    eval('var ' + defVars.join(',') + ';');
    return eval('(' + this + ').apply(scope, params);');
  }
  return this.apply(scope, params);
}

// Example

function foo(p1) {
  document.write('Variable [p1]: ', p1);
  document.write('<br />');
  document.write('Variable [x]: ', x);
  document.write('<br />');
  document.write('Variable [y]: ', y);
}

foo.applyVars(this, ['param X'], { x: "1'2\"3", y: false });

またはこれ:

function callWithVars(fn, scope, params, scope_variables) {
  if (scope_variables) {
    var variable, defVars = [];
    for (variable in scope_variables) {
      if (scope_variables.hasOwnProperty(variable)) {
        defVars.push(variable + '=scope_variables["' + variable + '"]');
      }
    }
    eval('var ' + defVars.join(',') + ';');
    return eval('(' + fn + ').apply(scope, params);');
  }
  return fn.apply(scope, params);
}

// Example

function foo(p1) {
  document.write('Variable [p1]: ', p1);
  document.write('<br />');
  document.write('Variable [x]: ', x);
  document.write('<br />');
  document.write('Variable [y]: ', y);
}

callWithVars(foo, this, ['param X'], { x: "1'2\"3", y: false });

于 2014-02-12T14:43:20.727 に答える