JavaScript 本地作用域 : var vs. this

标签 javascript scope scoping

我似乎无法理解 JavaScript 变量作用域的特定情况。与我发现的其他示例和问题不同,我对嵌套函数的范围界定很感兴趣。

我在 this JSFiddle 设置了一个示例.相关部分如下:

function MyObject() {
    var self = this;

    var a = 1;
    this.b = 2;

    var innerMethod = function() {
        //1 and 2: direct reference
        logMessage("a = " + a); // a = 1
        //logMessage("b = " + b); // Error: b is not defined

        //3 and 4: using this
        logMessage("this.a = " + this.a); // this.a = undefined
        logMessage("this.b = " + this.b); // this.b = undefined

        //5 and 6: using self
        logMessage("self.a = " + self.a); // self.a = undefined
        logMessage("self.b = " + self.b); // self.b = 2
    }
}

现在,我了解到对a 的引用直接有效。 我还了解到消息 3 和 4(this.athis.b)将失败,因为 this 指的是内部函数。我也知道第 6 行有效,因为我保存了对原始对象的引用。

我不明白的是:

  • 为什么消息 1 和 2 的效果不一样?
  • 为什么消息 5 和 6 的效果不一样?

最佳答案

a 变量就是一个变量。它在 innerMethod(这只是一个嵌套函数)的范围内可见,作为 a,这就是它的声明方式(即 JavaScript 具有词法范围规则,内部函数可以看到它们在其中定义的函数的变量)。

thisMyObject 构造函数的局部作用域不同。

你已经看到 selfMyObjectthis 的别名,并且 innerMethod 已经被覆盖this 在它自己的范围内。不过,由于 this 不是函数范围的别名,因此 self.athis.a 都不会在这里工作。

对于词法作用域的更严格的解释,您可以例如从维基百科开始:http://en.wikipedia.org/wiki/Scope_(computer_science)

您可以阅读 ECMA 标准中的执行上下文和标识符解析规则 http://es5.github.com/#x10.3

关于JavaScript 本地作用域 : var vs. this,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15046910/

相关文章:

javascript - Angular - 意外的标记 <

可从类方法访问的python类变量?

ruby-on-rails - 具有多个条件的 Rails 4 范围

php - 如何将对象包含的文件路径中的代码运行到对象外部的函数范围内?

function - 在 Julia 中,为什么局部作用域中的 "if false"语句可以修改函数定义?

Javascript 范围问题 : Can't change element via 'this' obj passed to function, 但我可以使用普通方法

php - 删除侧边栏商店页面 woocommerce

javascript - 无需安装编译器即可编译嵌入式 CoffeeScript?

javascript - 处理按钮点击

actionscript-3 - AS3 需要范围指导吗?