开发者社区> 问答> 正文

求问一个关于javascript this的问题??

 var Test={
     UA:navigator.userAgent,
     isAndroid:(function(){
         console.log(this.UA);
         // return /android/gi.test(this.UA);
     })()
 }

调用 Test.isAndroid 结果为undefined 此时的this指向的不是Test么

展开
收起
a123456678 2016-03-13 18:30:13 2148 0
2 条回答
写回答
取消 提交回答
  • 你这里isAndroid是一个具体值了,不是一个函数,this指向他的调用者

    2019-07-17 19:02:59
    赞同 展开评论 打赏
  • 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'
    2019-07-17 19:02:59
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
JavaScript异步编程 立即下载
Delivering Javascript to World 立即下载
编程语言如何演化-以JS的private为例 立即下载