特点

  • 代码不会显式地访问它;
  • Global对象为一种兜底对象,它所针对的是不属于任何对象的属性和方法;
  • 在全局作用域中定义的变量和函数都会变成 Global 对象的属性;

方法

URL编码方式

1
2
3
4
5
let uri = "http://www.wrox.com/illegal value.js#start"; 
// "http://www.wrox.com/illegal%20value.js#start"
console.log(encodeURI(uri));
// "http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.js%23start"
console.log(encodeURIComponent(uri));
1
2
3
4
5
let uri = "http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.js%23start"; 
// http%3A%2F%2Fwww.wrox.com%2Fillegal value.js%23start
console.log(decodeURI(uri));
// http:// www.wrox.com/illegal value.js#start
console.log(decodeURIComponent(uri));

eval()方法

  • 它接收一个参数,即一个要执行的 ECMAScript(JavaScript)字符串
1
2
3
eval("console.log('hi')"); 
//======等价于======
console.log("hi");
  • 当解释器发现 eval()调用时,会将参数解释为实际的 ECMAScript 语句,然后将其插入到该位置;
  • 通过 eval()执行的代码属于该调用所在上下文,被执行的代码与该上下文拥有相同的作用域链;
1
2
let msg = "hello world"; 
eval("console.log(msg)"); // "hello world"
  • 可以在 eval()内部定义一个函数或变量,然后在外部代码中引用:
1
2
eval("function sayHi() { console.log('hi'); }"); 
sayHi();
  • 通过 eval()定义的任何变量和函数都不会被提升,它们只是在 eval()执行的时候才会被创建
1
2
eval("let msg = 'hello world';"); 
console.log(msg); // Reference Error: msg is not defined

Global对象属性

  • 像 undefined、NaN 和 Infinity 等特殊值都是 Global 对象的属性;
  • 所有原生引用类型构造函数,比如 Object 和 Function,也都是 Global 对象的属性;

window对象

  • ECMA-262 没有规定直接访问 Global 对象的方式,但浏览器将 window 对象实现为 Global 对象的代理;
1
2
3
4
5
var color = "red"; 
function sayColor() {
console.log(window.color);
}
window.sayColor(); // "red"
  • 当一个函数在没有明确(通过成为౼个对象的方法,或者通过 call()/apply())指定 this 值的情况下执行时,this 值等于Global 对象
1
2
3
let global = function() { 
return this;
}();