我是JavaScript的初学者,我试图理解JavaScript中的Global窗口对象。因此,如果我只是想像一下我在控制台中编写的任何代码(如var text = "Hello"; console.log(text)
)都可以放在诸如Window{var text = "Hello"; console.log(this.text)} with this referencing window object
之类的窗口对象中,可以吗?如果我这样考虑可以吗?还是不正确?谢谢
答案 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
确实会默认写入全局,但var
和const
不会。
在节点中,没有先前引用的自由调用的函数不会从let
调用它们,而是会失败。这也严重影响了前端代码,因为当今用于浏览器的大部分javascript是通过webpack等在节点环境中预编译的。
因此,简洁地说:通常很难假设有关global
,global
和默认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 mode和let
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();