【问题标题】:Scope of object properties & methods对象属性和方法的范围
【发布时间】:2011-07-01 07:25:55
【问题描述】:

Show love to the object literal 文章中说:
当我们在一个页面中有多个脚本时,如果它们的名称重复,全局变量和函数将被覆盖。

一种解决方案是使变量 作为属性和函数作为方法 对象,并通过 对象名称。

但这会阻止变量进入全局命名空间的问题吗?

<script>
    var movie = {
        name: "a",
        trailer: function(){
           //code
        }
    };
</script>

在上面的代码中,哪些元素被添加到全局命名空间中?
a) 只是对象名称 - movie
b) 对象名称以及其中的属性和方法——movie, movie.name, movie.trailer()

【问题讨论】:

    标签: javascript object namespaces scope


    【解决方案1】:

    movie 将存在于全局命名空间中(在浏览器中:window)。在movie 范围内存在:nametrailer。如果您尝试从全局对象执行trailer,您可以看到这一点(window.trailer() 将导致ReferenceError: trailer is not defined)。 trailer 只能使用movie.trailer()(或window.movie.trailer())执行。

    Javascript 有 lexical 作用域,也就是 static 作用域,意思是:

    • 程序中特定位置的标识符始终引用相同的变量位置 — 其中“始终”表示“每次执行包含表达式时”,并且

    • 它所引用的变量位置可以通过对该标识符出现的源代码上下文的静态检查来确定,而不必考虑整个程序的执行流程 1.

    1Source

    【讨论】:

    • 在电影范围内存在:名称和预告片。 但是 JavaScript 有函数范围。这里的电影是一个对象。那么movie-scope是如何发挥作用的呢?
    • Javascript 有 lexical 范围,也就是 static 范围。查看我的编辑。
    • @Kooilnc:在您提供的链接的示例中,变量 a 包含在函数中。所以它的环境是函数f1。但是在问题的示例中,名称和预告片包含在使用对象文字符号定义的对象中,因此它不是函数而是对象。当我们从名称和预告片向外看时 - 没有功能,只有全局空间。那么名称和预告片不会在全局命名空间中吗?
    • 我认为您将function 视为唯一可能的范围环境。词法范围涉及该标识符出现的源代码上下文,因此对象可以拥有自己的范围。
    • @Kooilnc: 一个对象可以有它自己的范围?在 JavaScript 中,只能通过使用函数来引入新的作用域。 stackoverflow.com/questions/500431/javascript-variable-scope/… : 通常有一个全局作用域,定义的每个函数都有自己的嵌套作用域。 digital-web.com/articles/scope_in_javascript : 评估一个函数会建立一个不同的执行上下文
    猜你喜欢
    • 1970-01-01
    • 2015-06-20
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    相关资源
    最近更新 更多