2016-04-21 31 views
0

在下面的代码中,我想将驻留在父作用域上的函数的引用传递给函数“嵌套”的嵌套作用域,以便我可以调用函数嵌套函数的父范围。我尝试将它作为参数传递,但它不起作用。我只是在学习/搞乱嵌套关闭,并想知道这是否可以完成。将函数引用传递给嵌套闭包

我想有语法调用nested是:callme.nested()

var obj = function(val){ 
var access = val; 
var apex = 0; 
return { 
    callme : (function(siblyng){ 
     var privatevar = 2; 
     return { 
      nested : function(){ 
       privatevar++; 
       apex = privatevar; 
       return access + " " + privatevar + " " + siblyng("child"); 
      } 
     } 
    })(this.sibling), 
    assess : function(){ 
     return apex + " " + this.sibling("parent"); 
    }, 
    sibling : function(val){ 
     return "returned from " + val + " scope"; 
    } 
} 
} 
var objref = obj(true); 
console.log(objref.callme.nested()); 
console.log(objref.callme.nested()); 
console.log(objref.callme.nested()); 
console.log(objref.assess()); 
console.log(objref.sibling('global')); 
+2

“*将驻留在父范围内的函数的引用传递给函数嵌套的*​​”的嵌套范围。请说明哪个是引用,它是驻留函数,它是父作用域,它是嵌套作用域,哪个是嵌套函数。 – Oriol

+0

我想最接近的术语“函数嵌套和闭包”是高阶函数。这些函数返回(并生成)其他函数http://eloquentjavascript.net/05_higher_order.html根据返回的嵌套/自引用数据嵌套很可能会造成一团糟。 – lipp

+0

@Oriol,我更新了我的问题,我想要做的是从嵌套函数'nested'中调用函数'sibling'。但是,我尝试了两种不同的方式来传递函数的引用,但都没有成功。 – user2912840

回答

0

如果我明白你很好,你可以像这样

var obj = function(val){ 
var access = val; 
var apex = 0; 
var ret; 
return (ret = { 
    callme : function() { 
     var privatevar = 2; 
     return { 
      nested : function(){ 
       privatevar++; 
       apex = privatevar; 
       return access + " " + privatevar + " " + ret.sibling("child"); 
      } 
     }; 
    }(), 
    assess : function(){ 
     return apex + " " + this.sibling("parent"); 
    }, 
    sibling : function(val){ 
     return "returned from " + val + " scope"; 
    } 
    }); 
}; 

var objref = obj(true); 
console.log(objref.callme.nested()); 
console.log(objref.callme.nested()); 
console.log(objref.callme.nested()); 
console.log(objref.assess()); 
console.log(objref.sibling('global')); 
+0

请澄清在哪里修复? –

+0

var privatevar = 2, siselyng = this.sibling; //这里 你也可以使用箭头函数(但是这是ES 2015标准之一,因此它在旧版浏览器中不受支持,所以你将不得不使用像Babel或Traceur这样的转译器)。 –

+0

您可以设置一个[getter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get),使其像您所描述的那样工作。所以你必须写'get callme(){'而不是'callme:function(){' –

0

this在下面的代码是指向global Window对象,因此无法找到该方法。您可以在nested方法中直接调用this.sibling,而无需传递它。

callme : (function(siblyng){ 
    var privatevar = 2; 
    return { 
     nested : function(){ 
      privatevar++; 
      apex = privatevar; 
      return access + " " + privatevar + " " + siblyng("child"); 
     } 
    } 
})(this.sibling), 
+0

嵌套函数中的“this”将指向包含该函数的对象,因此不是他想引用的对象(具有同胞函数的那个​​)。 –

+0

是的,我的意思是你的解决方案。 –