理解Javascript的_this,不同类型的函数调用以及如何调用函数内的函数?

时间:2016-10-28 04:39:15

标签: javascript

我正在学习如何对现有的javascript代码进行逆向工程,我遇到了一些问题,这是因为我对核心javascript的工作原理缺乏了解。代码如下,以及我所拥有的评论的屏幕截图。

代码以声明 var warper 开始。

  • 然后warper变量等于函数内部的函数?为什么它不是函数Warper()的通常调用,而是它内部的另一个函数?
  • 我注意到了_this的使用。这与通常使用的常规 this 有何不同?
  • #btn-submit id设置为在单击时激活。我可以看到它调用click_submit函数,但为什么它是Warper.prototype.click_submit而不是 click_submit()
  • 我的最后一个问题,我真正想做的是通过js调用click_submit函数,而不必点击#btn-submit按钮。

问题:如何使用js调用warper.click_submit函数而无需单击按钮?我正在尝试将其集成到我的另一段代码中。

我试过warper.prototype.click_submit但它没有做任何事情。我假设它是因为它在函数中的函数内部?

enter image description here

(function() {
  var Warper;

  Warper = (function() {
    function Warper() {
      this.check_compatibility();
      this.attach_ux();
      if (window.SALT_DEFAULT != null) {
        $('#salt').val(window.SALT_DEFAULT);
        $('#salt').attr('disabled', true);
        $('.salt-label').text('Prefilled salt');
      }
    }

    Warper.prototype.check_compatibility = function() {
      if (typeof Int32Array === "undefined" || Int32Array === null) {
        return $('.form-container').html('<p>\n  Sorry, but your browser is too old to run WarpWallet, which requires Int32Array support.\n</p>');
      }
    };

    Warper.prototype.attach_ux = function() {
      $('#btn-submit').on('click', (function(_this) {
        return function() {
          return _this.click_submit();
        };
      })(this));
      $('#btn-reset').on('click', (function(_this) {
        return function() {
          return _this.click_reset();
        };
      })(this));
      return $('.what-salt').on('click', (function(_this) {
        return function() {
          return $('.salt-explanation').toggle();
        };
      })(this));
    };


    Warper.prototype.click_submit = function() {
      $('#btn-submit').attr('disabled', true).html('Running...');
      $('#btn-reset').attr('disabled', true).html('Running...');
      $('#passphrase, #salt, checkbox-salt-confirm').attr('disabled', true);
      $('.progress-pbkdf2, .progress-scrypt').html('');
      $('.progress-form').show();
      return warpwallet.run({
        passphrase: $('#passphrase').val(),
        salt: $('#salt').val(),
        progress_hook: (function(_this) {
          return function(o) {
            return _this.progress_hook(o);
          };
        })(this),
        params: window.params
      }, (function(_this) {
        return function(res) {
          $('#passphrase, #checkbox-salt-confirm').attr('disabled', false);
          if (window.SALT_DEFAULT == null) {
            $('#salt').attr('disabled', false);
          }
          $('#private-key').val(res["private"]);
          _this.write_qrs(res["public"], res["private"]);
          return console.log;
        };
      })(this));
    }; //click_submit

    return Warper;

  })(); // Warper End

  $(function() {
    return new Warper();
  });

}).call(this); // End Function

2 个答案:

答案 0 :(得分:5)

代码以声明 var warper 开始。

  
      
  • 然后warper变量等于函数内部的函数?为什么它不是函数Warper()的通常调用,而是它的内部   另一个功能?
  •   

创建它自己的范围是另一个功能。这种做法主要用于分离非相关代码并防止全局变量。

  
      
  • 我注意到了_this的使用。这与通常使用的常规 this 有何不同?
  •   

_this只是一个设置为指向外部this的变量。每次调用函数时,它都有自己的this(取决于你如何调用函数)。因此,如果在另一个函数中定义回调,并且需要引用该外部(&#34;另一个&#34;)函数的this,则可以将其临时保存到变量。此临时变量通常称为_thisthatself

  
      
  • #btn-submit id设置为在单击时激活。我可以看到它调用了click_submit函数,但为什么呢   Warper.prototype.click_submit而不仅仅是 click_submit()
  •   

如果在原型上定义函数,则每个实例都将使用相同的函数。如果你要在this.clik_submit = function(){...}上定义它,那么每个实例都必须拥有它自己的那个函数的副本。最后一个选项是在范围内定义function click_submit(){...},但是该功能不能从范围外部访问。

  
      
  • 我最后的问题,我真正想做的是通过js调用click_submit函数而不必点击      

    btn-submit按钮。

  •   

您需要获得对warper实例的访问权限才能调用click_submit函数。没有它(并且无法更新代码),就无法调用它。但是你可以考虑自己在按钮上创建点击事件,这将触发该功能。使用jquery就像$("#btn-submit").click();

一样简单

答案 1 :(得分:1)

Warper是一个对象。

Warper.prototype.attach_ux = function() {
  $('#btn-submit').on('click', (function(_this) { //2
    return function() {
      return _this.click_submit(); //3
  };
})(this));//1. 

on // 1'this'指Warper对象,并绑定到Warper.prototype.attach_ux函数的范围。

on // 2 _this是参数的名称,它引用// 1传递的值。

由于// 1引用Warper对象,因此调用click_submit方法。

这是函数调用的IIFE模式。 如果你打电话

$('#btn-submit').on('click', function(_this) { 
    return function() {
      return _this.click_submit();
  };
})

此处_this将引用click事件,我们无法方便地访问定义的方法。但我们可以使用IIFE模式传递Warper对象并轻松访问它。