3

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

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()函数;因为函数有作用域,它只能在它被声明的函数内执行,但是这个函数已经失去了它被创建的作用域并且它仍然被执行。请澄清一下?

4

1 回答 1

6

简单的解释:

  1. 在函数内部声明的任何变量都不能在该函数外部访问。
  2. 内部函数可以访问在其外部作用域上声明的变量(参见闭包)。

因此,您可以调用privateAlertfrom,Run因为两者都已在foo.

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

于 2013-02-05T16:58:01.947 回答