【问题标题】:Do function in javascript have scope?javascript中的函数有范围吗?
【发布时间】:2013-02-05 16:50:59
【问题描述】:

如果函数有作用域,就应该在那个作用域内执行,但是这里我觉得不一样,看代码:

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

【问题讨论】:

  • 我什至不明白如何您感到困惑,因此很难指出您的错误。
  • javascript 中没有“私有方法”之类的东西。如果它是对象的属性(可调用),则它可以由任何代码运行。实现“private”的唯一方法是通过闭包,您已经使用“privateAlert”函数完成了此操作。 “运行”相当于 C#/Java 中的公共函数,并且被认为类似于“类成员”。公共成员确实可以在高阶语言中调用私有函数,那么为什么不在这里呢?但是,正如@dystroy 所说,不要很快将 javascript 函数混淆为真正的 OOP 方法
  • 闭包经常被误解。您应该研究并了解它们是如何工作的,以加强您对 javascript 函数的了解。
  • 不确定这是否是问题的一部分,但alert(str + this.publicVal); 不会按照您的想法去做。 privateAlert 没有在任何对象上调用,因此 this 将是 null(在严格模式下)或 window(在非严格模式下)。你可以阅读更多关于上下文here的信息。

标签: javascript scope


【解决方案1】:

简单解释:

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

因此,您可以从Run 调用privateAlert,因为两者都已在foo 内部定义。

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

【讨论】:

    猜你喜欢
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2013-12-04
    • 1970-01-01
    相关资源
    最近更新 更多