【问题标题】:scopre of variable defined定义的变量范围
【发布时间】:2016-03-16 08:08:30
【问题描述】:

所以我有以下基本脚本,用于在整个项目中使用的常用功能。让我们用下面的代码调用这个 base.js

base.js

(function(document, window, undefined, $){

    if (typeof $ === undefined) {
        throw new Error("Site requires jQuery");
    }

    $.SPA = {};

    $.SPA.showAlert = function(msg) {
      alert(msg);
    };

})(document, window, undefined, jQuery);

而且我可以在特定页面中加载不同的脚本。

现在假设我有页面说,dashboard,它使用以下代码加载 dashboard.js -

dashboard.js

$(function() {
    $.SPA.showAlert("Bazzinga");
});

所以我可以毫无问题地访问$.SPA。但我的问题是,这是正确的还是可能导致 $.SPA 范围出现问题或有任何机会从其他脚本覆盖它?

【问题讨论】:

  • 任何脚本都可以覆盖它..但这就是我们所能做的......另一种解决方案是使用defineProperty并使其成为不可写的值 - 仅在现代浏览器中

标签: javascript jquery scope


【解决方案1】:

但我的问题是,这是正确的还是可能导致 $.SPA 出现问题 范围或从其他脚本覆盖它的任何机会?

$.SPA 位于全局范围内,因为 $ 具有全局范围。

是的,其他脚本可以覆盖它,因为它们也可以访问这个变量,这对于 JavaScript 中的大多数对象都是如此,因为它被设计为可扩展的。

您可以使用Object.freeze 使对象不可变

Object.freeze($.SPA);

在你的 IIFE 末尾添加这一行

(function(document, window, undefined, $){

    if (typeof $ === undefined) {
        throw new Error("Site requires jQuery");
    }

    $.SPA = {};

    $.SPA.showAlert = function(msg) {
      alert(msg);
    };

    Object.freeze($.SPA);

})(document, window, undefined, jQuery);

编辑:

根据@ArunPJohny 的评论,您还需要使用定义属性,因为单独冻结是不够的。

(function(document, window, undefined, $){

    if (typeof $ === undefined) {
        throw new Error("Site requires jQuery");
    }

    $.SPA = {};

    $.SPA.showAlert = function(msg) {
      alert(msg);
    };
    Object.defineProperty($, 'SPA', {
     enumerable: true,
     configurable: false,
     writable: false,
     value: {}
   });    

    Object.freeze($.SPA);

})(document, window, undefined, jQuery);

【讨论】:

  • @ArunPJohny 根据我指出的文档,它会阻止,只是它不会引发错误。要抛出错误,必须启用严格模式。
  • 文档是正确的,它只是冻结了分配给SPA属性的对象,我们仍然$SPA属性是可写的......所以仅仅使用freeze不会解决问题....您需要定义属性,使其不可写
  • @ArunPJohny 谢谢,做出改变以解决浅冻结问题
猜你喜欢
  • 2013-01-17
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多