看起来很容易,我想调用一个带有参数数组的函数。当然,我可以这样说func.apply(this, ['some', 'arguments']);
但这会改变func
内部的this
值。你有什么办法可以在不改变它的情况下完成吗?
看起来很容易,我想调用一个带有参数数组的函数。当然,我可以这样说func.apply(this, ['some', 'arguments']);
但这会改变func
内部的this
值。你有什么办法可以在不改变它的情况下完成吗?
由于 JavaScript 中 this
的工作方式,你无法实现该操作。请参阅以下内容:
根据 ECMAScript 规范的 “进入执行上下文” 部分:当您调用一个函数时,this
的值由其左侧的对象(称为激活对象)决定。让我们创建一个名为 Steve 的函数,并将它放在一个对象中:
function steve(){}
var obj = { method: steve };
当我们调用obj.method()
时,他的this
是obj
,因为obj
是激活对象。
最棘手的情况是当函数调用左侧没有任何东西的时候:
steve(); // Who am I ?!
函数调用左边没有任何东西——实际上相当于null
——因此this
的值被设置为全局对象的默认值(window
在Web浏览器中,global
在Node.js中等)。
因此,每次调用函数时,实际上都会设置它的this
。
P.S. 调用steve.apply(null, [])
相当于调用steve()
。
steve.apply(undefined, [])
和steve()
是等效的,尽管它们的行为在ES3和ES5之间有所不同。 - gsneddersthis
值。this
仍将是您传递给.bind()
的内容。 - s4y请注意,在ES6中,您也可以编写以下代码:
func(...someArray)
在 func
内部,this
变成了 Window
,但这没有什么用处。但是如果你这样写:
obj.func(...someArray)
this
在func
内部将是obj
。
这可能是我5年前正在寻找的功能,但那是5年前的事了,所以谁还记得 :)
当调用函数时,this
的值并不是什么神秘的东西,它取决于函数的“正常”调用方式(不使用 call
或 apply
):
func(); // `this` is the global object, or undefined in ES5 strict mode
obj.func(); // `this` is `obj`
this
的值,只需根据通常的调用方式,将正确的值传递给apply
即可:func.apply(undefined, []); // global object, or undefined in ES5 strict mode
obj.func.apply(obj, []);
null
。func.apply(null, ['some', 'arguments']);
var arr = [];
arr.push.apply(arr, ['some', 'arguments']);
你想要的没有太多意义。
在 ECMAScript 标准中,this
是这样定义的:
11.1.1 关键字 this - 关键字 this 的求值结果为当前执行上下文的 ThisBinding 值。
函数执行上下文中的 ThisBinding 解析方式如下:
10.4.3 输入函数代码 当控制进入包含在函数对象F中的函数代码的执行上下文时,将执行以下步骤:self = this
null
作为第一个参数传递。但是,在func
中,this
应该指代什么? - jAndythis
。 - Lightness Races in Orbit.apply()
来调用它。我以为函数会以某种方式与它的对象绑定在一起,所以我不想像apply()
那样改变它,但是显然没有这样的联系,apply()
只是处理被调用的函数本身。 - JussiR