JavaScript中几个特殊的对象:window对象、this对象、global对象

本文深入探讨了JavaScript中的三个特殊对象:window对象、this对象及Global对象。解释了这些对象的作用域、属性和方法,以及如何在实践中正确使用它们。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaScript中几个特殊的对象:

	1)window对象:
		在全局作用域中声明的变量、函数都是window对象的属性和方法。
		
	2)this对象:
		this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window;当函数被作为某个对象的方法调用时,this等于那个对象。
		特别注意:匿名函数的执行环境具有全局性,因此匿名函数中的this对象通常指向window对象!!!

		例子1:
			var name = "the window";
			var obj = {
				name : "my object",
				getName : function(){
					return function(){
						return this.name;
					}
				}
			};
			var nameValue = obj.getName()();
			alert(nameValue);		// the window
		
			解析:
				var nameValue = obj.getName()();	 即:
				var nameValue = function(){
									return this.name;
								}();
				注意:匿名函数function(){return this.name;}的执行环境具有全局性,故匿名函数中的this对象指向window对象
		
		例子2:
			var name = "the window";
			var obj = {
				name : "my object",
				getName : function(){ 
					// 把匿名函数的外部(函数)作用域中的this对象保存在一个闭包能够访问到的变量里。
					var that = this;
					return function(){
						return that.name;
					}
				}
			};
			var nameValue = obj.getName()();
			alert(nameValue);		// my object
		
			解析:
				var nameValue = obj.getName()();	 即:
				var nameValue = function(){
									return that.name;
								}();
			说明:that不是关键字,只是一个普通的变量。闭包访问变量的顺序:闭包中的局部变量、外部函数的局部变量、全局变量!!!

			
	3)Global对象:
		1)所有在全局作用域内定义的属性和方法,都是Global对象的属性。
		2)Global对象不能直接使用,也不能用new运算符创建。
		3)Global对象在JavaScript引擎被初始化时创建,并初始化其方法和属性。
		4)浏览器把Global对象作为window对象的一部分实现了,因此,所有的全局属性和函数都是window对象的属性和方法。

		Global对象的属性;
			Object		构造函数Object
			Function	构造函数Function
			Date		构造函数Date
			Array		构造函数Array
			RegExp		构造函数RegExp
			Error		构造函数Error
			String		构造函数String
			Boolean		构造函数Boolean
			Number		构造函数Number
			
			undefined	特殊值undefined
			NaN			特殊值NaN
			
		Global对象的方法:

			encodeURI():
				1)对整个URI进行编码。
				2)只对空格进行编码,不会对冒号、正斜杠、问号、井号等进行编码。
				3)编码后的结果:除了空格被替换成了%20之外,其它的都没有发生变化。
				4)对应的解码方法:decodeURI()
			
			encodeURIComponent():
				1)对部分URI(指除去协议、主机地址、端口后的部分)进行编码。
				2)对任何非标准字符进行编码。
				3)对应的解码方法:decodeURIComponent()		
			
			URI编码方法说明:
				1)有效的URI中不能包含某些字符(例如:空格等)。
				2)用特殊的UTF-8编码替换所有无效的字符,从而让浏览器能够接受和理解。
				
			eval():当解析器发现代码中调用eval()方法时,它会将传入的参数当作实际的JavaScript语句来解析。

	

JavaScript 中,将对象中的方法赋值给变量后再通过该变量调用时,`this` 的指向会发生变化。这种情况下,`this` 不再是指向原始对象,而是默认指向全局对象(如 `window` 或者 `global`),或者是严格模式下的 `undefined`。这是因为直接从对象上调取方法和单独调用函数有着不同的 `this` 绑定规则。 让我们来看一些具体的例子帮助理解这一点: ### 示例1:非严格模式下 ```javascript const myObject = { value: 'hello', method: function() { console.log(this.value); } }; // 直接调用myObject.method() myObject.method(); // 输出: hello // 把method赋值给一个变量并调用它 const fn = myObject.method; fn(); // 非严格模式下输出: undefined (因为此时this指向window/global, 并不存在value属性) ``` ### 示例2:严格模式下 ```javascript 'use strict'; const anotherObj = { prop: 42, showProp: function() { console.log(this.prop); } }; const funcRef = anotherObj.showProp; funcRef(); // 严格模式下抛出错误TypeError: Cannot read property 'prop' of undefined 因为此时this是undefined ``` 为了避免这种情况发生,并保持原有的上下文,我们可以采用以下几种解决方案: #### 方案一:使用 `.bind()` 方法 `.bind()` 返回一个新的函数,同时设置了新的 `this` 上下文。 ```javascript const boundMethod = myObject.method.bind(myObject); boundMethod(); // 正确地打印出了 "hello" ``` #### 方案二:利用闭包保存对原对象的引用 你可以返回一个匿名函数并在其中访问对外部作用域中定义的对象进行操作。 ```javascript function createBoundFunction(obj) { return function(...args) { obj.method.apply(obj, args); // 显式设定this为目标对象 }; } const customFunc = createBoundFunction(myObject); customFunc(); // 同样能够正确打印 "hello" ``` #### 方案三:箭头函数简化语法糖 ES6 引入了箭头函数,它们不会创建自己的 `this`,相反会捕获外层函数的作用域链里的 `this` 值。因此,在某些简单的情况下,可以直接使用箭头函数来解决问题。 ```javascript const arrowFn = () => myObject.method(); arrowFn(); // 成功显示 "hello", 当然这实际上还是需要依赖于原来的对象结构 ``` 总之,在处理对象内嵌的方法时一定要特别注意如何维护好正确的 `this` 上下文。通常来说,最推荐的做法之一是使用 `.bind()` 来确保一致性以及可预测的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值