关于this指向的问题

1、求解答为什么x.x调用结果会是undefined

function a(xx){
    this.x = xx;
    return this;
}
var x = a(5);
var y = a(6);
console.log(x.x);
console.log(y.x);

提问者问题是:

求解答为什么x.x调用结果会是undefined

现在来分析下为什么会输出undefined:

var x = a(5);
执行过程中,由于函数a是在全局作用域调用,所以,函数内部的this指向window。
所以this.x = 5; 相当于:window.x = 5;
return this,也就是说var x = a(5); 中的x变量的值是window   =>   var x = window;
这里的x将函数内部的x的值覆盖了。
    为什么会覆盖??
        因为:所有使用var声明的全局对象,都是window对象的属性。window.x和 在全局使用var声明的x是同一个变量。
然后执行console.log(x.x); 实际上是:console.log(window.x); window对象中没有x属性,所以会输出undefined

访问一个对象的属性的时候,如果这个对象没有这个属性,会返回undefined。如下:

let obj = {
	a: 1
}

console.log(obj.a);	// 1
console.log(obj.b);	// undefined

 

2、下面的代码输出什么

let length = 10;
function fn() {
	console.log(this.length);
}

var obj = {
	length: 5,
	method: function(fn) {
		fn();	
		arguments[0]();		
		
	}
}

obj.method(fn, 1);

上面的代码输出什么?下面来详细解析

首先来看代码执行,obj.method(fn, 1);
obj对象里边的method是一个函数,它里边的fn()执行的时候,应用了this默认绑定规则(点击这里查看为什么是应用了默认绑定规则),所以this指向window
window.length是等于0,所以执行这行语句的时候会输出 0 。
有人会问,全局作用域不是声明了一个length对象吗?为什么不是输出10?
原因是这个length对象使用let关键字声明的,它不属于全局window对象的一个属性,所以window.length 和它(let length = 10)是两个不同的对象。这是一个坑!

接下来是执行arguments[0](); 
arguments对象是一个类数组,它的第0位下标是实参列表的第1个参数,也就是fn函数。
当这个fn函数调用的时候,它的this被绑定到arguments对象上。
因为obj.method传入了两个参数,所以arguments对象的length属性为2

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值