如何访问函数调用者上下文?

我想了解JavaScript范围,我想知道是否在下面的例子中:

// B can access 'context' var a = function (context) { b = function () { console.log(context); }; b(); }; a('nicccce'); // works! // C can't access 'context' var d = function () { console.log(context); }; var c = function (context) { d(); }; c('oh oh'); // breaks 

有没有办法从“d”function访问“上下文”?

编辑:

我知道我可以将parameter passing给d函数,这显然是理智的事情,但我想知道是否有另一种方法,可能使用this.callee作为this.callee.arguments[0]

你也可以

1)将context传递给d就像为ca 。 要么
2)把context int d的词法范围。

选项2听起来很复杂,但事实并非如此。 这正是你在做b的情况。 context被“closures”到b的执行范围,因为该variables在b调用者的范围内是可用的(因为它是a的一个参数)。

不,这是不可能的,并会导致非常丑陋/不可读的意大利面代码。

为什么你不能把它作为函数的parameter passing? 另一个(也是丑陋的)解决scheme是在两个函数都可以访问的范围内声明variables(即在父函数或全局函数中)

在你的例子中,“context”是一个variables,其作用域是c()和a()(在两个不同的作用域中具有相同名称的两个不同的variables)。

从你如何命名variables“context”来看,我觉得.call是你在找什么?

值得一提的是,一旦你阻止了范围,javaScript中的范围实际上是非常简单的。 出现在function { ... }之间的任何东西都是一个范围。

在你的情况下,如果你通过上下文作为参数在C它不会中断:

 // C can access 'context' var d = function () { console.log(arguments[0]); }; var c = function (context) { d(context); }; c('oh oh'); // doesn't break 

在d中你可以通过使用argv / args来访问它(不能完全记得)所以像args [0]或者argv [0]

编辑:

用参数改变了代码

定义位于顶部范围内的variables:

 (function(){ var global; var d = function () { console.log(global); }; var a = function (local) { global = local; b = function () { console.log(global); }; b(); }; }())