有关JS脚本参数参数的建议

时间:2019-01-19 09:41:39

标签: javascript

我正在研究Flannagan的“ Javascript:权威指南”。有一节说明如何通过添加新方法来增强Javascript类。示例脚本显示了如何将新的方法“ Times”添加到数字原型(这就是我的解释方式)。

我正在努力了解以下脚本中的参数参数,尤其是“上下文”。

 // Invoke the function f this many times, passing the iteration number
// For example, to print "hello" 3 times:
//     var n = 3;
//     n.times(function(n) { console.log("hello"); });



Number.prototype.times = function(f, context) {
    var n = this.valueOf();
    console.log(n);
    for(var i = 0; i < n; i++) f.call(context, i);
};

    var n = 3;

    n.times(function(n) { console.log("hello"); });

我认为f的值变为:

function(n) { console.log("hello"); })

我不确定“上下文”是什么?

任何帮助都感激不尽...

3 个答案:

答案 0 :(得分:2)

times接受一个功能; context参数使您可以指定该函数内部引用的值this,如果需要。

在您的示例中,传递给times的回调根本不使用this,因此它不是必需的,但是可以想象该回调是否依赖于this引用一个对象:

const obj = {
  count: 3,
  increment: function() {
    this.count++;
    console.log(this.count);
  }
};
obj.increment();
obj.increment();

obj.increment函数取决于obj.count。为了使此功能在您的times函数中起作用,您需要this来引用obj,因此将其作为第二个参数传递给times,这样{{ 1}}作为第一个参数传递给obj

.call

如果将不同函数传递给Number.prototype.times = function(f, context) { var n = this.valueOf(); console.log('repeating ' + n + ' times:'); for(var i = 0; i < n; i++) f.call(context, i); }; const obj = { count: 3, increment: function() { this.count++; console.log(this.count); } }; (3).times(obj.increment, obj);,则该自定义this是不必要的,该函数本身会调用.times

obj.increment

答案 1 :(得分:1)

  

我认为f的值变为:

// Blablabla before getline
getline(cin, str);
getline(cin, str);
stringstream split(str);
// The rest of your code

对!

  

我不确定“上下文”是什么?

“上下文”是人们有时使用(错误地,恕我直言)来指代函数调用的function(n) { console.log("hello"); }) 值的词。

在对this的呼叫中:

times

...没有n.times(function(n) { console.log("hello"); }); 参数传递给context的参数,因此times的{​​{1}}参数值将得到times 。然后,它将在undefined中使用该值。当您将context(或f.call(...))与undefined一起使用时,在宽松模式下,将null设置为全局对象时调用该函数;在严格模式下,该函数改为看到Function.prototype.call ase thisthis

因此在该示例中,将使用全局对象undefinednull作为this来调用回调。

它类似于Array.prototype.forEachundefined参数,并且相关。

答案 2 :(得分:0)

context是传递给times的第二个值,由于调用this而成为函数内的f.call(context, i)特殊变量值(第一个值是this值)。

Number.prototype.times = function(f, context) {
    var n = this.valueOf();
    console.log(n);
    for(var i = 0; i < n; i++) f.call(context, i);
};

var n = 3;

n.times(function(n) { console.log(this, n); }, "hello");

此行为看起来很奇怪的原因是因为this必须是一个对象,所以字符串被转换为String对象(类似于Array对象,因此数组的外观)。

这在您使用prototype函数的情况下更为有用:

Number.prototype.times = function(f, context) {
    var n = this.valueOf();
    console.log(n);
    for(var i = 0; i < n; i++) f.call(context, i);
};

var arr = [1, 2, 3, 4];
(3).times(Array.prototype.reverse, arr);

console.log(arr);