我正在学习如何对现有的javascript代码进行逆向工程,我遇到了一些问题,这是因为我对核心javascript的工作原理缺乏了解。代码如下,以及我所拥有的评论的屏幕截图。
代码以声明 var warper 开始。
我试过warper.prototype.click_submit但它没有做任何事情。我假设它是因为它在函数中的函数内部?
(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
答案 0 :(得分:5)
代码以声明 var warper 开始。
- 然后warper变量等于函数内部的函数?为什么它不是函数Warper()的通常调用,而是它的内部 另一个功能?
创建它自己的范围是另一个功能。这种做法主要用于分离非相关代码并防止全局变量。
- 我注意到了_this的使用。这与通常使用的常规 this 有何不同?
_this
只是一个设置为指向外部this
的变量。每次调用函数时,它都有自己的this
(取决于你如何调用函数)。因此,如果在另一个函数中定义回调,并且需要引用该外部(&#34;另一个&#34;)函数的this
,则可以将其临时保存到变量。此临时变量通常称为_this
,that
或self
。
- #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对象并轻松访问它。