这是2020海康威视的一道笔试题
var obj = {
name: 'zpj',
sayHello: ()=>'Hello ' + this.name
}
obj.sayHello();
1. 分析:
- this指向取决于函数的调用方式。如果是function函数,当作方法调用打印的应该是’zpj’
var obj = {
name: 'zpj',
sayHello: function(){return 'Hello ' + this.name;}
}
obj.sayHello();
- 箭头函数的this指向继承自外部环境的
this
指向。这里指向window
,所以是在输出window.name
。我们并没有var name;
显式声明,所以认为window.name = undefined
,猜测输出的应该是'Hello undefined'
,但是事实上输出的却是‘Hello ’
var obj = {
name: 'zpj',
sayHello: ()=>'Hello ' + this.name
}
obj.sayHello();
- 直接输出
window.name
发现输出不是undefined
而是空字符串""
- 原来,
window.name
是每个网页默认有的属性,记录open
方法或iframe
给定的name
属性
window.open('https://www.baidu.com', 'mywin');
window.name === 'mywin';
- 如果变量名不是特殊的name,输出就会“如您所愿”了
var obj = {
_name: 'zpj',
sayHello: ()=>'Hello ' + this._name
}
obj.sayHello();
- 可以使用call来改变this指向使得输出正确吗?答案是NO!箭头函数的this指向无法改变。
var obj = {
_name: 'zpj',
sayHello: ()=>'Hello ' + this._name
}
obj.sayHello.call(obj);
2. 总结
- 全局环境下定义的变量会自动注册为
window
的属性 name
, self
, top
, location
, status
等不要作为全局变量名,因为他们都是window
的属性- 对象方法不要使用箭头函数定义,
this
指向会错误 - 箭头函数this指向无法改变