В настоящее время я изучаю javascript из окончательного руководства, и многие примеры кода используют xyx.call(undefined,/*args*/)
вместо того, чтобы просто вызвать функцию как xyz(/*args*/)
. Я знаю, что если для исполняемого контекста установлено значение undefined, то значение этого будет относиться к глобальному объекту. Я не могу понять, почему это делается в большинстве примеров, поскольку они не зависят от значений глобального объекта. Может кто-нибудь помочь мне понять разницу.differnce между sum (x, y) vs sum.call (undefined, x, y)
Некоторые реализации Array.protype.reduce
if (!Array.prototype.reduce) {
Array.prototype.reduce = function(callbackfn, initialValue) {
"use strict";
var O = Object(this),
lenValue = O.length,
len = lenValue >>> 0,
k,
accumulator,
kPresent,
Pk,
kValue;
if (typeof callbackfn !== 'function') {
throw new TypeError();
}
if (len === 0 && initialValue === undefined) {
throw new TypeError();
}
k = 0;
if (initialValue !== undefined) {
accumulator = initialValue;
} else {
kPresent = false;
while(!kPresent && k < len) {
Pk = k.toString();
kPresent = O.hasOwnProperty(Pk);
if (kPresent) {
accumulator = O[Pk];
}
k += 1;
}
if (!kPresent) {
throw new TypeError();
}
}
while(k < len) {
Pk = k.toString();
kPresent = O.hasOwnProperty(Pk);
if (kPresent) {
kValue = O[Pk];
accumulator = callbackfn.call(undefined, accumulator, kValue, k, O);
}
k += 1;
}
return accumulator;
};
}
и некоторые используют:
if (!Array.prototype.reduce) {
Array.prototype.reduce = function(callback /*, initialValue*/) {
'use strict';
if (this == null) {
throw new TypeError('Array.prototype.reduce called on null or undefined');
}
if (typeof callback !== 'function') {
throw new TypeError(callback + ' is not a function');
}
var t = Object(this), len = t.length >>> 0, k = 0, value;
if (arguments.length == 2) {
value = arguments[1];
} else {
while (k < len && ! k in t) {
k++;
}
if (k >= len) {
throw new TypeError('Reduce of empty array with no initial value');
}
value = t[k++];
}
for (; k < len; k++) {
if (k in t) {
value = callback(value, t[k], k, t);
}
}
return value;
}; }
так что в одном методе функция обратного вызова вызывается с помощью вызова() и в другом осуществлении его не
'call' может сделать немного больше, чем просто контролировать этот контекст. Можете ли вы показать нам, как эта функция используется? – Halcyon
В строгом режиме 'this' будет' undefined', а не 'window', как в' xyx() ', так и' xyx.call() '. – Oriol
@Oriol поэтому зачем использовать оба взаимозаменяемых – Nik6019