Javascript:运行在此闭包外定义的函数,就好像它是在此闭包中定义的

时间:2015-05-15 14:15:10

标签: javascript

我希望有一个函数A接受另一个函数B作为参数,然后运行B,因为它是在A的闭包范围内定义的,即可以访问所有局部变量。

例如,简单地说:

var A = function(B){
  var localC = "hi";
  B();
}

var B = function(){
  console.log(localC);
}

A(B); // to log 'hi'

我找到的唯一方法是使用eval。 ec6会提供更好的选择吗?

3 个答案:

答案 0 :(得分:1)

一种解决方案是在函数localC中传递B作为参数:



var A = function(B) {
  var localC = "hi";
  B(localC);
}

var B = function(localC) {
  console.log(localC);
}

A(B); // outputs hi




替代使用arguments



var A = function(B) {
   var localC = "hi";
   B(localC, "test");
 }

 var B = function() {
   var i = 0;
   for (i; i < arguments.length; i++) {
     console.log(arguments[i]);
   }
 }

 A(B); // outputs hi, test
&#13;
&#13;
&#13;

答案 1 :(得分:0)

&#13;
&#13;
var A = function(B){
  var self = this;
  self.localC = "hi";
  self.localD = "hello";
  B();
};

var B = function(){
  var self=this;
  alert(self.localD);
}

A(B); // to log 'hi'
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您可以将上下文显式化并将其传递给B

var A = function(B){
    var context = {
        localC: "hi"
    };
    B(context);
}

var B = function(context){
    console.log(context.localC);
}

A(B); // hi

您还可以将thisnewprototype

一起使用
var A = function() {
    this.localC = "hi";
}
A.prototype.b = function(context){
    console.log(this.localC);
}

var a = new A();
a.b(); // hi

或没有prototype

var A = function() {
    this.localC = "hi";
}

var a = new A();
a.b = function(context){
    console.log(this.localC);
};
a.b(); // hi

您可以将thisbind

一起使用
var a = {
    localC: "hi"
};
function B(foo) {
    console.log(this.localC, foo);
}
B.bind(a)("foo"); // hi foo
// .call:
B.call(a, "foo"); // hi foo

bind设置this的上下文。 call将上下文视为第一个参数。

这个好:

var A = function(B){
    var localC = "hi";
    B.bind(this)(); // this is the global object, you need `new` to create a new scope
}

var B = function(){
    console.log(this.localC);
}
A(B); // undefined