【问题标题】:Help with JavaScript scope帮助 JavaScript 作用域
【发布时间】:2010-02-01 05:42:22
【问题描述】:

我担心我今天可能会失去理智,因为我不知道如何去做我想做的事。我想要一个可以从我的任何其他 JavaScript 函数调用的自定义提示。我不知道如何完成这项工作,尽管它感觉就像我已经完成了一百次。

这是一个例子

var modal = function() {

    var prompt = function(msg) {
        // custom prompt builder here... let's return hard coded for example's sake
        return true;
    };

}();

var items = function() {
    var init = function() {

        $('.delete').click(function() {
            var confirm = modal.prompt('Are you sure you wanna delete that pal?');
        });

    };    


    $(document).ready(init);    
}();

我想做的是调用modal的prompt方法,根据用户输入得到一个返回值。现在这个,我可以做,但我在调用内部方法时遇到问题。我想将这些组合在一起,因为我可能也会有一个自定义模式 alert()

请不要建议内置的 JavaScript OK/Cancel,因为我必须这样做。

非常感谢!

【问题讨论】:

  • 旁白:如果您要立即调用匿名函数,最好给函数加上括号。这使得通话更加明显。如果您不这样做,那么有人可能不会注意到尾随的 () 是您的意图错误。
  • @otis 你的意思是把整个东西包在额外的一对或括号里吗?我想我以前似乎是这样的。感谢您的提示。
  • 无论如何,您将无法根据用户输入获得返回值,因为脚本将在用户交互进入图片之前完整执行(返回语句和所有)。您必须使用不同的流程,该流程依赖于回调。您将无法模仿提示的本机行为。

标签: javascript jquery scope


【解决方案1】:

从您调用modal.prompt 的方式来看,您似乎希望匿名函数返回一个将存储在modal 中的对象:

var modal = (function() {
    // various private fields & methods here
    ...
    // the public interface
    var self = {
        prompt: function(msg) {
            // custom prompt builder here... let's return hard coded for example's sake
            return true;
        }
    };
    return self;
})();

【讨论】:

  • 感谢额外有用的 cmets。
【解决方案2】:

对于您的第一个问题,prompt 函数在您的 modal 对象中声明为变量,您无法访问它,因为您实际上并未公开它:

var modal = (function() {
  var privateMethod1 = function () {/*...*/},
      privateVar = 'foo';

  function privateMethod2() {
    //...
  }

  return { // public members
    prompt: function (msg) {
      // custom prompt builder here... let's return hard coded for example's sake
      return true;
    }
  };
})();

现在解决以下问题:

我想做的是调用modal的prompt方法,根据用户输入得到一个返回值。

用户输入是一个异步动作,我建议你使用基于回调的模型,内置的JavaScript OK/Cancel window.prompt实际上可以返回一个值,因为它停止代码执行 并等待用户输入。

var modal = (function() {
    return {
      prompt: function(msg, okCallback, cancelCallback) {
        // ...

        $('#okButton').click(function () {
          // internal actions here, like closing the dialog, cleanup, etc...
          okCallback(); // execute the ok callback
        });

        $('#cancelButton').click(function () {
          // ...
          cancelCallback(); // execute the cancel callback
        });
      }
    };
})();

【讨论】:

    【解决方案3】:

    我强烈建议任何打算养成编写 JavaScript 代码习惯的人阅读并理解此http://www.jibbering.com/faq/faq_notes/closures.html

    这非常重要。

    【讨论】:

    • +1 Alex 可能会也可能不会混淆闭包和属性,但这是一个很棒的文档。
    • 该文档涵盖的不仅仅是闭包。它详细介绍了范围。
    【解决方案4】:

    你试过了吗:

    var modal = {
        prompt : function(msg) {
               return true;
             }
    };
    

    然后你可以这样称呼它:

    modal.prompt();
    

    【讨论】:

    • 我想你的意思是建议: var modal = { prompt : function(msg) { return true; } };
    猜你喜欢
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2017-10-05
    • 2011-10-21
    相关资源
    最近更新 更多