【问题标题】:passing parameter to closure function in javascript在javascript中将参数传递给闭包函数
【发布时间】:2011-06-12 16:10:48
【问题描述】:
MyLibrary.MyModule =
        (
            function initialise() {
                this.id = id;
                this.c = document.getElementById(id);
                this.ctx = this.c.getContext('2d');

                this.properties = {
                    setup: {
                        backgroundColour: options.setup.backgroundColour || 'black'
                    },

                    scale: {
                        show: options.scale.show || true,
                        colour: options.scale.color || 'white'
                    },
                }
                console.log(properties.setup.baseFontSize);
            }
        )(id, options);

我正在使用

调用此代码
new MyLibrary.MyModule('c',options);

但“id”和选项似乎没有定义。
有人可以帮忙吗?

【问题讨论】:

  • 我从这样的东西开始(没有闭包),然后我想我会尝试将函数重构为闭包。 MyLibrary.MyModule = function initialise(id,options) { this.id = id;.. }
  • 通过重构,您是在调用构造函数而不是分配它。如果您希望它具有一些默认值,您应该拥有您正在调用 return 构造函数的函数。喜欢:MyLibrary.MyModule = ( function( _id,_options) {return function initialise(id,options) { /* your function body */ }; })(id,options);,虽然我不确定这是否是你这样做的原因。

标签: closures javascript-objects javascript


【解决方案1】:

正如所写,我认为这不会像你想要的那样做。您将“MyLibrary.MyModule”初始化为基本上没有;该“初始化”函数没有返回值,而您调用它时就好像它确实有返回值一样。

我不知道你想做什么,但是:

MyLibrary.MyModule = (function whatever() { /* ... */ })(id, options);

表示,“调用函数whatever,参数列表由变量“id”和变量“options”的值组成,然后在引用的对象上设置属性“MyModule” "MyLibrary" 到从该函数调用返回的任何值。"

据我所知,当烟雾散去时,“MyLibrary.MyModule”将不再是一个函数。也许如果你解释了你想要它的意思,那么有人可以帮助解决它。

【讨论】:

    【解决方案2】:

    您的MyLibrary.MyModule 本身就是undefined。这是因为您正在调用一个匿名函数,没有返回值来分配给它。

    我假设您打算这样做:

    MyLibrary.MyModule = function initialise(id, options) {
                this.id = id;
                this.c = document.getElementById(id);
                this.ctx = this.c.getContext('2d');
    
                this.properties = {
                    setup: {
                        backgroundColour: options.setup.backgroundColour || 'black'
                    },
    
                    scale: {
                        show: options.scale.show || true,
                        colour: options.scale.color || 'white'
                    },
                }
                console.log(properties.setup.baseFontSize);
            };
    

    现在你可以这样做了:

    var inst = new MyLibrary.MyModule('c',options);
    

    ...'c'options 将作为构造函数的参数接收。

    如果您立即调用的函数表达式的目的是关闭构造函数可以引用的某个默认值,那么 IIFE 将需要返回一个引用的函数那个值。

    【讨论】:

      【解决方案3】:

      你想要这样的东西:

      MyLibrary.MyModule = function(id, options) {
          this.id = id;
          this.c = document.getElementById(id);
          this.ctx = this.c.getContext('2d');
      
          this.properties = {
              setup: {
                  backgroundColour: options.setup.backgroundColour || 'black'
              },
      
              scale: {
                  show: options.scale.show || true,
                  colour: options.scale.color || 'white'
              },
          }
      };
      

      【讨论】:

        猜你喜欢
        • 2015-07-22
        • 2011-10-02
        • 2016-01-16
        • 2019-07-15
        • 1970-01-01
        • 2011-04-16
        • 2012-04-11
        • 2014-10-18
        相关资源
        最近更新 更多