2016-04-21 60 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

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