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

时间:2012-03-22 18:10:29

标签: javascript node.js

我正在尝试理解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'功能访问'上下文'?

修改

我知道我可以将参数传递给d函数,这显然是理智要做的事情,但我想知道是否还有另一种方法,可能使用{{1} } this.callee

5 个答案:

答案 0 :(得分:1)

你可以

1)将context传递给d,就像ca一样。或
2)将context置于d的词法范围内。

选项2听起来很复杂,但事实并非如此。这正是你在b的情况下所做的。 contextb的执行范围“封闭”,因为该变量在b的调用者范围内可用(因为它是a的参数)。

答案 1 :(得分:0)

不,这是不可能的,会导致非常难看/不可读的意大利面条代码。

为什么不能将它作为参数传递给函数?另一个(但也很难看)解决方案是在两个函数都可以访问它的范围内声明变量(即在父函数或全局函数中)

答案 2 :(得分:0)

在您的示例中,“context”是一个作用于函数c()和a()的变量(两个不同作用域中具有相同名称的两个不同变量)。

根据您如何命名变量“context”,我认为.call正是您要找的?

值得一提的是,一旦你忘记了块范围,javaScript中的范围实际上非常简单。 function { ... }之间出现的任何内容都是范围。

答案 3 :(得分:0)

在您的情况下,如果您将上下文作为参数传递给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]

编辑:

使用参数更改代码

答案 4 :(得分:0)

定义位于顶部范围内的变量:

(function(){

    var global;

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

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

}())