Javascript函数闭包和访问父作用域

时间:2014-04-12 07:00:10

标签: javascript scope closures

我有一个问题,关于闭包和父作用域,我在Javascript中尝试的是否可行。这是我的代码:

var func1 = function() {
    // console.log(this.source1);   // wont work, makes sense
    // console.log(source1);        // wont work, wish it would
    console.log(this.source2);      // works fine
    console.log(source2);           // works fine
};
var func2 = function() {
    var source1 = "source1";
    this.source2 = "source2";
    func1.call(this);
}();
var func3 = function() {
    var source3 = "source3";
    var func4 = function() {
        console.log(source3); // also works fine, makes sense
    }();
}();

有什么方法可以访问func1里面func2上用var声明的变量,还是我运气不好?

3 个答案:

答案 0 :(得分:1)

你问题的答案是否定的。

内部函数的范围仅限于其自己的范围和声明内部函数的外部函数的范围(未调用但声明)。

console.log(this.source2);工作正常,因为两个函数都有window作为其上下文(窗口扮演外部函数的角色)。 this = window在这些职能中。

答案 1 :(得分:1)

正如其他人所说 - 不。

但是如果你将整个东西放在包装中并使用Revealing Module Pattern,那么你可以。

var module = (function() {
    var source1;
    var source2;

    var func1 = function() {
        console.log(source2);           // works fine
    };
    var func2 = function() {
        source1 = "source1";
    }();
    var func3 = function() {
        var func4 = function() {
            console.log(source1); // also works fine, makes sense
        }();
    }();

    return {
      func1: func1,
      func2: func2,
      func3: func3
    };

}());

// Then invoke them.
module.func2();
module.func1();

修改

然后您可以将它们重新分配回原始名称。

var func1 = module.func1;
var func2 = module.func2;
var func3 = module.func3;

答案 2 :(得分:1)

嗯,不,它不会起作用,也不应该。谢天谢地:)这正是本地变量的行为方式。

你可以做的一件事是将所需的变量传递给函数 func1 (函数应该期望它。这没有问题 - 如果你希望某个地方调用这个函数而不传递变量, Javascript完全没问题吧)

另一件事是声明没有“var”关键字的 source1 变量。然后它会工作,但除非你保持对全局变量的良好跟踪,否则你真的不应该这样做。