javascript中的函数有范围吗?

Mai*_*hak 3 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 Code Online (Sandbox Code Playgroud)

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

bfa*_*tto 6

简单的解释:

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

所以,你可以调用privateAlertfrom,Run因为两者都是在里面定义的foo.

还有一两件事:Run不是一个私有方法bar,这是一个公共方法.