javascript中的函数有范围吗?

时间:2013-02-05 16:51:00

标签: javascript scope

如果函数有范围,它们应该在该范围内执行,但在这里我认为它是不同的参见代码:

function foo() {
    var privateVal = "Private Val";
    this.publicVal = "Public Val";

    var privateAlert = function (str) {
        alert(str + this.publicVal);
        alert(str + privateVal);
    }

    this.Run = function () //see here
    {
        privateAlert("Private Call: ");

        this.publicAlert = privateAlert;
        this.publicAlert("Public Call: ");

        privateAlert = this.publicAlert;
        privateAlert("Private Call: ");
        this.publicAlert("Public Call: ");
    }
}

var bar = new foo();
bar.Run();

创建新对象时,Run()成为对象的公共方法,或者方法只属于var bar。该方法不能从其中执行privateAlert()函数;因为函数具有范围,所以它只能从已声明的函数内执行,但是这个函数已经失去了创建它的范围并且它仍然被执行。请澄清一下吗?

1 个答案:

答案 0 :(得分:6)

简单的解释:

  1. 在函数外部无法访问函数内声明的任何变量。
  2. 内部函数可以访问在其外部作用域上声明的变量(请参阅closures)。
  3. 因此,您可以从privateAlert致电Run,因为两者都已在foo内定义。

    还有一件事:Run 不是 bar的私有方法,它是一种公共方法。