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
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