收藏
回答

小程序中闭包问题

问题模块 框架类型 问题类型 操作系统 工具版本
开发者工具 小程序 Bug Windows V1.02.1804251

var user = 'The Global';

var obj = {

user: 'The object',

getUser: function (){

return function (){

return this.user;

}

}

};


Page({


/**

  * 页面的初始数据

  */

data: {


},


btn_run: function () {

console.log(obj.getUser()());

}

})

如上所述代码,在闭包中使用this对象调用obj对象中的user属性时,会报名undifine错误。

这是为什么?

VM1646:1 thirdScriptError

Cannot read property 'user' of undefined;at pages/index/index page btn_run function

TypeError: Cannot read property 'user' of undefined

    at http://127.0.0.1:63456/appservice/pages/index/index.js:8:18

    at e.btn_run (http://127.0.0.1:63456/appservice/pages/index/index.js:21:30)

    at e.<anonymous> (http://127.0.0.1:63456/appservice/__dev__/WAService.js:18:4907)

    at e.a (http://127.0.0.1:63456/appservice/__dev__/WAService.js:17:31002)

    at z (http://127.0.0.1:63456/appservice/__dev__/WAService.js:17:24941)

    at Function.<anonymous> (http://127.0.0.1:63456/appservice/__dev__/WAService.js:17:26562)

    at http://127.0.0.1:63456/appservice/__dev__/WAService.js:18:509

    at http://127.0.0.1:63456/appservice/__dev__/WAService.js:6:26768

    at e.(anonymous function) (http://127.0.0.1:63456/appservice/__dev__/WAService.js:4:4917)

    at a (http://127.0.0.1:63456/appservice/appservice:1008:9451)


最后一次编辑于  2018-05-14  (未经腾讯允许,不得转载)
邀请回答
复制链接收藏投诉关注问题回答

12 个回答

  • 陈
    2018-05-14

    请问这里是在干嘛,看不懂你在写什么,能讲解一下吗

    var obj = {

    user: 'The object',

    getUser: function (){

    return function (){

    return this.user;

    }

    }

    };


    2018-05-14
    赞同
    回复 1
    • One piece
      One piece
      2018-05-14
      JavaScript的匿名函数的闭包
      2018-05-14
      赞同
      回复
  • zilch
    zilch
    2018-05-14

    可以参考一下javascript中this的用法

    2018-05-14
    赞同
    回复 6
    • One piece
      One piece
      2018-05-14
      我看了下JavaScript中的this。它是指向正在执行的对象。但是在真正的JavaScript中上述代码是可以执行的。
      2018-05-14
      赞同
      回复
    • One piece
      One piece
      2018-05-14
      我运行代码后发现不用this时可以正常执行,此时返回全局变量的user值。在使用call冒充对象时就一定要加上this。此时this.user返回的值是obj对象的user属性值。请问这又是什么情况?
      2018-05-14
      赞同
      回复
    • zilch
      zilch
      2018-05-14回复One piece
      你这样写,this指向的是function,不是obj
      2018-05-14
      赞同
      回复
    • One piece
      One piece
      2018-05-14
      我看到网上其他人都是这样写。是不是小程序的JS与JavaScript有一些不一样? 此链接是网上其他人解释this的文章 https://www.cnblogs.com/pssp/p/5216085.html
      2018-05-14
      赞同
      回复
    • One piece
      One piece
      2018-05-14
      是因为这个匿名函数,闭包的问题吗?
      2018-05-14
      赞同
      回复
    查看更多(1)
  • @🐲较瘦
    @🐲较瘦
    2018-05-15

    小程序的页面内的全局变量,应该是需要放在data里的。可以去了解一下vue.js跟小程序的js还是比较相通的

    2018-05-15
    赞同
    回复 2
    • One piece
      One piece
      2018-05-15
      是的,小程序的页面内的全局变量,应该放在data里。不过我这里想实验下javascript中的一些语法功能。(JavaScript 微信小程序)与(Java 安卓)有点像。这里的问题是this的这个表示什么。我看了JavaScript,this代表当前执行的对象。所以如"zilch "所说指的是匿名函数function
      2018-05-15
      赞同
      回复
    • One piece
      One piece
      2018-05-16回复One piece
      var obj = { user: 'The object', getUser: function () { return function () { return this; } } }; var user = 'The Global'; Page({ /** * 页面的初始数据 */ data: { }, btn_run: function () { console.log(obj.getUser()()); } }) 此段代码执行后的结果是undefined,能帮忙解释下吗?
      2018-05-16
      赞同
      回复