Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法理解backbone.js教程示例_Javascript_Backbone.js_Underscore.js - Fatal编程技术网

Javascript 无法理解backbone.js教程示例

Javascript 无法理解backbone.js教程示例,javascript,backbone.js,underscore.js,Javascript,Backbone.js,Underscore.js,我正在学习backbone.js,但在理解第一个示例时遇到了问题: (function($){ var ListView = Backbone.View.extend({ ... initialize: function(){ _.bindAll(this, 'render'); // fixes loss of context for 'this' within methods this.render(); // not all views ar

我正在学习backbone.js,但在理解第一个示例时遇到了问题:

(function($){
  var ListView = Backbone.View.extend({
    ...
    initialize: function(){
      _.bindAll(this, 'render'); // fixes loss of context for 'this' within methods

       this.render(); // not all views are self-rendering. This one is.
    },
    ...
  });
  ...
 })(jQuery);
问题1:为什么要使用
(函数($){})(jQuery)
;而不是一个完美的工作
(function(){})()


问题2:
.bindAll(这个“呈现”)做什么?它如何修复方法中“this”上下文的丢失?

Q1:通过将jquery作为参数传入,您可以实现两件事:

  • 如果需要使用两个版本的jquery,您已经准备好了
  • 模块模式可能更好地被认为是封装良好、具有定义良好的依赖关系的东西,所以通过声明jquery是一个参数,您就可以声明清晰的依赖关系。当然还有其他的方法(比如),但这也是一种方法
  • 问题2:
    bindAll
    是substander.js中的一个实用方法,它为特定方法绑定
    ——因此,当调用该方法(例如作为回调)时,将在其内部使用正确的

    例如:

    (function($){
      var ListView = Backbone.View.extend({
        ...
        initialize: function(){
            // fixes loss of context for 'this' within methods
            _.bindAll(this, 'render', 'makestuff'); 
    
            this.render(); // not all views are self-rendering. This one is.
        },
        ...
        makestuff : function() { 
            ... 
            this.stuff = ... // some action on the list's instance
        }
      });
      ...
     })(jQuery);
    
    在代码的某些部分,您可以执行以下操作:

    var list = new ListView({...});
    $('#button').on('click', list.makestuff);
    
    makestuff
    方法中,此
    是对上述
    列表的引用,而不是在
    makestuff
    函数内部实际调用时,
    on
    函数所处的任何上下文

    实际实现依赖于使用
    apply
    call
    函数将函数执行的上下文绑定到特定对象。

    (函数($){})(jQuery)
    jQuery
    传递给将其用作
    $
    的自执行对象。这确保了您可以在闭包中安全地使用
    $
    符号,而不必担心与其他库甚至其他版本的jQuery的干扰。这种做法的一个常见示例是传入
    窗口
    文档
    ,然后在闭包内使用速记:

    (function(w, d, $){
    $(w).resize(function({}); //equals $(window) now
    })(window, document, jQuery);
    
    下划线的
    。.bindAll
    执行以下操作:

    将对象上由MethodName指定的许多方法绑定到 无论何时调用它们,都可以在该对象的上下文中运行。非常 对于将用作事件的绑定函数非常方便 处理程序,否则将以相当无用的方式调用。 如果没有提供MethodName,则对象的所有函数 属性将绑定到它


    请参见了解操作方法。

    谢谢,另一个答案解释得更详细,对不起,我选择了他