访问 JavaScript 严格函数
Access javascript strict function
我正在学习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的样子:
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
。严格模式在范围界定功能内有效,但在范围界定功能之外无效。
在浏览器上,您可以使用 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
。
- 从函数JavaScript返回不可变数组/对象
- 将对象传递给函数.JavaScript
- 如何定义const函数javascript(语法糖)
- 新的日期函数javascript
- TypeError:this.getAttribute不是一个函数-javascript
- 从函数javascript发送变量
- 扩展自容器函数Javascript
- 从内部函数javascript内部分配外部函数的对象
- 使用函数JavaScript中的函数
- 在这里使用回调函数(JavaScript)有什么好处吗
- 来自函数 Javascript 的 NaN 返回值 ||函数执行顺序
- 将“e”传递给一个新函数 - javascript
- 调用函数中的一个函数——Javascript
- 传递的变量不适用于我的函数-Javascript
- 如何将类方法设置为等于多个函数?-Javascript
- 显示php中的函数javascript
- 如何使用php代码创建函数Javascript弹出框
- 未调用的外部函数-javascript
- 如何在类中运行函数.Javascript
- 关闭mouseover上的一个函数——Javascript,jQuery