首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何访问闭包保留的变量?

如何访问闭包保留的变量?
EN

Stack Overflow用户
提问于 2018-01-19 06:10:47
回答 3查看 59关注 0票数 1

我正在尝试获取闭包保留的变量。我甚至不确定这是否可能。

下面是我的代码:

代码语言:javascript
运行
复制
function MyBooks (author, title){

      this.author = author;
      this.title = title;

      return function addPrice(amount){

          return amount;
      }

 }
 var MyBooksObj=MyBooks('Tolkin','Hobbit');
 alert(MyBooksObj('100 dollars')); //outpot: 100 dollars
 alert("author: " + MyBooksObj.author); //outpot: author: undefined
 alert("title: " + MyBooksObj.title); //outpot: title: undefined

有人知道如何使用变量'MyBooksObj‘从函数外部访问'author’和'title‘吗?

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2018-01-19 06:18:07

在函数上使用new运算符可以创建一个与结果绑定了"this“的新对象。

代码语言:javascript
运行
复制
function MyBooks (author, title){

      this.author = author;
      this.title = title;

      this.addPrice= function (amount){

          return amount;
      }

 }
 var MyBooksObj= new MyBooks('Tolkin','Hobbit');
 alert(MyBooksObj.addPrice('100 dollars')); //output: 100 dollars
 alert("author: " + MyBooksObj.author);     //output: auther: Tolkin
 alert("title: " + MyBooksObj.title);       //output: title: Hobbit

票数 2
EN

Stack Overflow用户

发布于 2018-01-19 06:57:44

您的代码中出现了一些错误和错误的假设。这就是我所感觉到的

  • No 新的语法被用来定义你的新对象。
  • 当你从一个对象返回一个函数时,对象会松散地保持它的内部结构,只返回这个函数。例如,addPrice
  • amount变量{:‘MyBooks’,title:‘’}变成了闭包函数:变量不是闭包,而是使用this.amount将其值存储在对象内存中。

所以为了纠正你的代码。我的建议是:

代码语言:javascript
运行
复制
        function MyBooks(author, title){
        this.author = author;
        this.title = title;
        this.amount = 0;

        this.addPrice = function(amount){

            return this.amount += amount;
        }

        }
        var MyBooksObj= new MyBooks('Tolkin','Hobbit');
        alert(MyBooksObj); //ouput object
        alert(MyBooksObj.addPrice(100)); //output: 100 dollars
        alert(MyBooksObj.addPrice(100))  //output: 200 dollars
        alert("author: " + MyBooksObj.author); //output: auther: Tolkin
        alert("title: " + MyBooksObj.title); //output: title: Hobbit`
票数 2
EN

Stack Overflow用户

发布于 2018-01-19 06:28:52

您还可以使用Class和构造函数:

代码语言:javascript
运行
复制
class MyBooks {
  constructor(author, title) {
    this.author = author;
    this.title = title;
  }

  setAmount(value) {
    this.amount = value;
  }

  getAmount() {
    return this.amount;
  }

}

var MyBooksObj= new MyBooks('Tolkin','Hobbit');
MyBooksObj.setAmount('100 dollars');
 alert(MyBooksObj.getAmount()); //outpout: 100 dollars
 alert("author: " + MyBooksObj.author); //outpout: author: Tolkin
 alert("title: " + MyBooksObj.title); //outpout: title: Hobbit

更多细节:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

同样有趣的是:https://coryrylan.com/blog/javascript-es6-class-syntax

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48331152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档