关于JavaScript中的Global对象的困惑

时间:2019-05-20 14:11:25

标签: javascript

我是JavaScript的初学者,我试图理解JavaScript中的Global窗口对象。因此,如果我只是想像一下我在控制台中编写的任何代码(如var text = "Hello"; console.log(text))都可以放在诸如Window{var text = "Hello"; console.log(this.text)} with this referencing window object之类的窗口对象中,可以吗?如果我这样考虑可以吗?还是不正确?谢谢

3 个答案:

答案 0 :(得分:1)

/** * Available variables: * user - the current user * realm - the current realm * clientSession - the current clientSession * userSession - the current userSession * keycloakSession - the current userSession */ //insert your code here... // use the Identifier variable to filter the relevant groups for this client var identifier = 'aws'; var StringArray = Java.type("java.lang.String[]"); var ArrayList = Java.type('java.util.ArrayList'); var GroupSet = user.getGroups(); var Output = new ArrayList(); var identifier = identifier.toLowerCase(); for each (var group in GroupSet) { if (group.getName().toLowerCase().contains(identifier)){ var GroupNameArray = (group.getName().split('-')); var tenant = GroupNameArray[2]; var role = GroupNameArray[3]; Output.add("Arn:aws:iam::"+tenant+":saml-provider/company,arn:aws:iam::"+tenant+":role/"+role); } } Output; 对象或默认global上下文进行假设并不十分安全,因为它在一个JavaScript运行时之间可能会有所不同,并且the strict mode之类的某些功能也会更改这种行为。

请记住,javascript不仅在浏览器中运行-并且例如在node.js中是全局的,无法像在浏览器中那样运行-并且在那里存在许多不同的浏览器实现。

此外,尽管在某些环境中this确实会默认写入全局,但varconst不会。

在节点中,没有先前引用的自由调用的函数不会从let调用它们,而是会失败。这也严重影响了前端代码,因为当今用于浏览器的大部分javascript是通过webpack等在节点环境中预编译的。

因此,简洁地说:通常很难假设有关globalglobal和默认window绑定的事情并使其正确。 假设您没有默认的全局对象,并且总是显式引用this ,可能更安全,例如:

config.js

window

user.js

window.config = {foo: 'bar'}

window.someGlobalFunction = function() {...}

答案 1 :(得分:1)

  

“可以使用全局对象吗?”

当然可以。如果您知道陷阱,并<目的>使用全局对象而不是偶然使用

 (function() {
    name = 12; // Note: This *is* a global variable
    console.log(typeof name); // string. WTF
 })();

陷阱是:

1)所有未声明的(!)变量和用var声明的全局变量自动获得全局对象的一部分。这很糟糕,因为这种情况没有任何正当理由,因此您应避免这种情况(使用strict modelet and const)。

2)您运行的所有脚本都具有相同的全局对象,因此属性可能会冲突。这就是上面示例中发生的情况,name与全局window.name getter / setter对冲突,后者将数字转换为字符串。因此,如果您在全局对象中设置属性,请确保该名称仅由您使用,而不由其他人使用(浏览器,库,您编写的其他代码段...)

如果您知道这些陷阱并避免了它们,则可以并且应该有目的地使用全局对象 ,前提是并且仅当您计划在不同脚本之间共享某个函数/变量时,页面,因此,如果该页面确实应该是可全局访问的

 let private = 1;  
  window.shared = 2;

答案 2 :(得分:0)

是的,可以从窗口对象示例中访问任何函数或变量:

var foo = "foobar";
foo === window.foo; // Returns: true


function greeting() {
   console.log("Hi!");
}

window.greeting(); // It is the same as the normal invoking: greeting();