var Test={
UA:navigator.userAgent,
isAndroid:(function(){
console.log(this.UA);
// return /android/gi.test(this.UA);
})()
}
调用 Test.isAndroid 结果为undefined 此时的this指向的不是Test么
var Test = {} 是一个声明+赋值的运算,赋值就是先对等号右边的表达式求值,然后将结果赋给等号左边的变量——换句话说:只有赋值成功后才能访问 Test。
而 isAndroid 是在对等号右边表达式求值时就运行的(IIFE),此时由于 Test 还没有完成赋值,IIFE 实际访问的 this 是 window,而 window.UA 是不存在的,因此 undefined 无误。
JavaScript 是动态语言,this 的指向是在代码执行时由解释器决定的,你写的这个 isAndroid 本质上是编译型语言里的 getter 方法,所以不要用 IIFE 来在声明时自动求值。
如果你不想用 Test.isAndroid() 这样的方式来访问 this.UA,你可以写 JavaScript 的 get isAndroid 方法,这个要看你使用的 ES 版本来决定具体的写法了,可上网搜索 JavaScript getter/setter 作进一步学习。
补充一个样本,对浏览器支持有要求,自行做转换或找 shim 支持:
var Test = {
UA: 'test ua',
get isAndroid() {
console.log(this.UA)
}
}
Test.isAndroid
// 'test ua'
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。