gpt4 book ai didi

javascript - 访问 javascript 严格函数

转载 作者:行者123 更新时间:2023-12-02 16:32:00 25 4
gpt4 key购买 nike

我正在学习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 );
};

这解决了所有三个问题。前两个是通过删除作用域函数来处理的(但这确实意味着代码创建了两个全局变量);第三个(未声明的变量)通过添加 var 来修复在以 printUserInformation = function... 开头的行前面。我还添加了;在该函数表达式的末尾,因为您想要 ;在赋值语句的末尾。

<小时/>

在您提出的评论中:

can u tell me how can i access with using (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; }(); 有效( x 将是 42 ),但可能会扔人。

这是 #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 。严格模式在作用域函数内有效,但在其外部无效。

在浏览器上,不要使用 this ,您可以使用window ,它是全局对象(例如全局变量)上引用全局对象的属性。所以你可以这样做:

(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。)

关于javascript - 访问 javascript 严格函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28209243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com