我正在研究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"); })
我不确定“上下文”是什么?
任何帮助都感激不尽...
答案 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 this
或this
。
因此在该示例中,将使用全局对象undefined
或null
作为this
来调用回调。
它类似于Array.prototype.forEach
的undefined
参数,并且相关。
答案 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);