访问 JavaScript 严格函数

Access javascript strict function

本文关键字:函数 JavaScript 访问      更新时间:2023-09-26

我正在学习Javascript'使用严格'模式,面临一个微不足道的问题......如果我的理解不好,请纠正我。

文件1.js

(function () {
    'use strict';
     var testObject = {
            "id" : 1,
            "label" : "Object 1"
        };
     printUserInformation = function (userName){
          console.log(" Test Object is "+testObject + " User is "+ userName );
     }
});

文件2.js

printUserInformation("StackOverflow User");

但是当我从严格模式之外调用/调用函数时,会出现未定义的错误,并且无法访问testObject。任何指南都将有用。

主要问题与严格模式无关。您的printUserInformation函数的作用域仅限定为您放入的匿名函数,它不是全局函数,因此file2.js无权访问它。还有其他一些问题:你从不调用你的范围函数,所以它里面的代码(包括定义printUserInformation的代码永远不会运行),如果是,它会抛出一个ReferenceError,因为你试图分配给一个未声明的变量(printUserInformation),这会导致严格模式下的错误。

如果您只想为file1.js启用严格模式而不避免创建全局变量,则不需要范围函数:

'use strict';
var testObject = {
       "id" : 1,
       "label" : "Object 1"
};
var printUserInformation = function (userName){
      console.log(" Test Object is "+testObject + " User is "+ userName );
};

这涉及所有三个问题。前两个是通过删除范围函数来处理的(这确实意味着代码创建了两个全局);第三个(未声明的变量)通过在以 printUserInformation = function... 开头的行前面添加 var 来固定。我还在该函数表达式的末尾添加了一个;,因为您希望在赋值语句的末尾有一个;


在评论中,您问:

你能告诉我如何使用(function () { printUserInformation ..... })访问吗

如果你想使用范围函数(这通常是一个好主意),但在其中创建全局变量,你有几个选择:

    调用范围函数时,将
  1. 要公开的内容从范围函数中返回

  2. 通过分配给全局对象上的属性在作用域函数中创建全局

这是#1的样子:

var printUserInformation = (function() {
    'use strict';
    var testObject = {
           "id" : 1,
           "label" : "Object 1"
    };
    var printUserInformation = function (userName){
          console.log(" Test Object is "+testObject + " User is "+ userName );
    };
    return printUserInformation;
})();

请注意,我们不仅定义了作用域函数,还调用了它最后的()),这是问题代码中缺少的。

在那里,testObject仍然很好地包含(它不是全局的),但printUserInformation是全局的。

我应该注意的是,包裹在函数周围的括号在那里并不是绝对必要的,但是如果我们没有将结果分配给某个地方,它们将是必需的,所以人们习惯于看到它们。 var x = function() { return 42; }();有效x42),但可能会把人扔掉。

以下是#2外观的众多方式之一:

(function(global) {
    'use strict';
    var testObject = {
           "id" : 1,
           "label" : "Object 1"
    };
    global.printUserInformation = function (userName){
          console.log(" Test Object is "+testObject + " User is "+ userName );
    };
})(this);

全局范围内而不是在严格模式下,this 是指全局对象。因此,我们将该引用作为参数传递到范围函数中,global 。严格模式在范围界定功能有效,但在范围界定功能之外无效。

在浏览器上,您可以使用 window ,而不是使用 this ,这是全局对象(例如,全局变量)上的一个属性,用于引用全局对象。因此,您可以改为执行此操作:

(function() {
    'use strict';
    var testObject = {
           "id" : 1,
           "label" : "Object 1"
    };
    window.printUserInformation = function (userName){
          console.log(" Test Object is "+testObject + " User is "+ userName );
    };
})();

但这只是在浏览器上,而不是在其他环境(NodeJS,SilkJS等)中。

使用范围函数非常方便。在像浏览器这样的环境中,全局命名空间非常拥挤,避免创建全局是一件好事(tm)。如果您不使用 AMD(RequireJS 等),通常最好只创建一个全局,即您放置任何其他内容的对象。其模式如下所示:

// This bit is in each file: It creates the `MyApp` global and
// initializes it with a blank object if it doesn't already exist,
// or just uses the existing MyApp object if it already exists.
var MyApp = window.MyApp || {};
// Then we define this file's contents inside a scoping function
(function() {
    "use strict";
    // ...private stuff here...
    // Let's make one public function
    MyApp.printUserInformation = function() { /* ... */ };
})();

(在非浏览器环境中,您可以在上述环境中将window更改为this