.apply(数学,arrayName)是如何工作的?(javascript)
关于如何在javascript中找到值数组的最小值或最大值,存在一个stackoverflow问题。这不是那个问题 我想知道为什么传递.apply(数学,arrayName)是如何工作的?(javascript),javascript,this,Javascript,This,关于如何在javascript中找到值数组的最小值或最大值,存在一个stackoverflow问题。这不是那个问题 我想知道为什么传递.apply()会有奇怪的事情,因为这个参数仍然有效。尽管Aaron Crane告诉我们Math对象的API是如何变成现在的样子的,但仍然有一些问题没有得到回答 以下每一个代码段都可以工作。我的问题是,怎么做?对这个的赋值到底发生了什么,使得每个都能工作 标准结构 var values = [45, 46, 47] var min = Math.min.apply
.apply()
会有奇怪的事情,因为这个
参数仍然有效。尽管Aaron Crane告诉我们Math对象的API是如何变成现在的样子的,但仍然有一些问题没有得到回答
以下每一个代码段都可以工作。我的问题是,怎么做?对这个的赋值到底发生了什么,使得每个都能工作
标准结构
var values = [45, 46, 47]
var min = Math.min.apply(Math, values);
alert(min); //45
一个奇怪的结构,但范围可能很复杂
var values = [45, 46, 47]
var min = Math.min.apply(this, values);
alert(min); //45
有点奇怪
var values = [45, 46, 47]
var min = Math.min.apply(global, values);
alert(min); //45
更奇怪的是,也许b/c浏览器还可以
var values = [45, 46, 47]
var min = Math.min.apply(window, values);
alert(min); //45
很奇怪
var values = [45, 46, 47]
var min = Math.min.apply(null, values);
alert(min); //45
真奇怪
var values = [45, 46, 47]
var min = Math.min.apply(undefined, values);
alert(min); //45
使用.apply()
时,第一个参数控制执行函数时此指针值的设置。在许多情况下,此
值至关重要。在少数情况下,这个
值根本不在函数实现中使用(通常称为不操作实例数据的静态函数)。当未使用此
时,此
设置为什么并不重要,因此.apply()
的第一个参数设置为什么也不重要
因此,在您的特定情况下,Math.min()
和Math.max()
(可能还有所有的Math.xxx()
函数)根本不使用这个
指针,因为它们基本上都是静态函数,不会对实例数据进行操作。因此,它设置为什么并不重要,因此您可以将任何您想要的作为第一个参数传递给Math.min.apply()
,并且它不会更改函数调用的结果
我认为,仍然应该传递正确的值,这将是Math
,因为这就是当你做一个正常的:
Math.min(x, y);
因此,要在使用.apply()
时向Math.min()
呈现与上述代码完全相同的情况,请执行以下操作:
var arr = [x, y];
Math.min.apply(Math, arr);
var obj = {
a: 1,
b: function () {
return this.a;
},
c: function () {
return 3;
}
}
在我看来,这有助于养成正确的习惯,正确思考第一个论点应该是什么,因为它在其他情况下也很重要
仅供参考,jQuery中的$.when.apply($,arr)
经常会出现类似的问题,它在实现中也没有使用这个参数,因此可以将其称为$.when.apply(null,arr)
甚至$.when.apply(“foo”,arr)
。就我个人而言,我更喜欢通过第一个“技术正确”的论点;DR-Math.min()
和Math.max()
实际上不使用传递给他们的这个参数,这只是让他们接受一个参数数组的一种技巧,因为本机API只指定了一个变量列表.apply()
可以接受参数数组,这就是使用它的原因
我猜,Math
是作为这个
参数传入的,只是为了干净
多亏了@Jonathan Lonowski和@Niet the Dark Absol.apply
的第一个参数所做的就是为调用它的函数设置上下文(this
)
比如说,你有一个这样的物体:
var arr = [x, y];
Math.min.apply(Math, arr);
var obj = {
a: 1,
b: function () {
return this.a;
},
c: function () {
return 3;
}
}
如果调用obj.b()
,您将得到1
作为返回值,因为在这种情况下,此
是通过调用b
并在其前面加上obj
)来定义的。要更改此设置,您可以使用apply
:
obj.b.apply({a:2});
这将返回2,因为您现在显式地将设置This
设置为{a:2}
但是:如果你有一个函数,它不会在内部使用this
,而不管this
有什么值。所以你可以打电话:
obj.c();
或其中一项:
obj.apply.c(null);
obj.apply.c(undefined);
obj.apply.c("xyz");
但是您总是会得到相同的结果3
。这就像设置一个从未使用过的变量。无论它的价值是什么,它都不会影响结果
因此显然,Math.min
没有使用this
,因此在传递“无效”上下文时不会中断。这(可以说)是JavaScript的一个棘手部分
当你有一个函数时,有一个神奇的变量叫做this
。根据调用函数的方式,其上下文的设置会有所不同
function myFunction() {
return this;
}
var myObject = {
fn: function() {
return this;
}
};
myFunction(); // the global object. `window` in browsers, `global` in Node.js
myFunction.apply(Math); // Math
myFunction.apply({ hello: "world" }); // { hello: "world" }
myObject.fn(); // myObject
myObject.fn.apply(myObject); // myObject
myObject.fn.apply(Math); // Math
上面的例子之所以有效,是因为min
根本不使用this
,因此您可以将其分配给任何您想要的对象。Math.min
在任何方面都不使用this
,因此您传递它的内容实际上并不重要,这不重要。作为thisArg
传递的值仅对函数
重要,前提是它依赖于this
具有特定值。以及,Math.min()
。apply
的第一个参数是应在函数中用作此
的值。由于Math.min
不使用this
进行任何操作,因此从逻辑上讲,通过参数传递的this
并不重要……您最好将“foobar”
或9/11
作为第一个参数传递到此处应用。