Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.apply(数学,arrayName)是如何工作的?(javascript)_Javascript_This - Fatal编程技术网

.apply(数学,arrayName)是如何工作的?(javascript)

.apply(数学,arrayName)是如何工作的?(javascript),javascript,this,Javascript,This,关于如何在javascript中找到值数组的最小值或最大值,存在一个stackoverflow问题。这不是那个问题 我想知道为什么传递.apply()会有奇怪的事情,因为这个参数仍然有效。尽管Aaron Crane告诉我们Math对象的API是如何变成现在的样子的,但仍然有一些问题没有得到回答 以下每一个代码段都可以工作。我的问题是,怎么做?对这个的赋值到底发生了什么,使得每个都能工作 标准结构 var values = [45, 46, 47] var min = Math.min.apply

关于如何在javascript中找到值数组的最小值或最大值,存在一个stackoverflow问题。这不是那个问题

我想知道为什么传递
.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
作为第一个参数传递到
此处应用