在Javascript中,有相当于.apply的不';你不能改变这个值吗?
看起来很简单,我想用参数数组调用一个函数。当然,我可以说在Javascript中,有相当于.apply的不';你不能改变这个值吗?,javascript,function,arguments,apply,Javascript,Function,Arguments,Apply,看起来很简单,我想用参数数组调用一个函数。当然,我可以说func.apply(这个,['some','arguments')但这将更改函数内this的值。您知道如何在不更改函数的情况下执行此操作吗?如果您单独调用函数,请传递null func.apply(null, ['some', 'arguments']); 如果调用的函数是对象的方法,请传递该对象 var arr = []; arr.push.apply(arr, ['some', 'arguments']); 为了匹配工作方式。您不
func.apply(这个,['some','arguments')
但这将更改函数内this
的值。您知道如何在不更改函数的情况下执行此操作吗?如果您单独调用函数,请传递null
func.apply(null, ['some', 'arguments']);
如果调用的函数是对象的方法,请传递该对象
var arr = [];
arr.push.apply(arr, ['some', 'arguments']);
为了匹配工作方式。您不能,因为在JavaScript中的工作方式。请继续阅读:
查看ECMAScript规范的一节:当您调用函数时,this
的值由其左边的内容决定(称为激活对象)。让我们创建一个名为steve的函数,并将其放入一个对象中:
function steve(){}
var obj = { method: steve };
…当我们将steve称为obj.method()
时,他的this
是obj
,因为obj
是激活对象
棘手的情况是当函数调用的左边没有任何内容时:
steve(); // Who am I ?!
函数调用左侧没有任何内容-实际上,它是null
-因此this
的值被设置为全局对象的默认值(在web浏览器中为window
,在Node.js中为global
,等等)
因此,实际上,每次调用函数时,都要设置函数的this
另外,调用steve.apply(null,[])
相当于调用steve()
你想要的东西没有多大意义
在ecmascript标准中,此的定义如下:
11.1.1该关键字的计算结果为
这是当前执行的绑定
上下文
函数执行上下文的thisBinding解析通过以下方式指定:
10.4.3输入功能代码时,执行以下步骤:
控件进入执行上下文
对于包含在中的函数代码
函数对象F,提供的调用方
此参数,并提供了一个调用方
论点列表:
如果函数代码是严格代码,请将ThisBinding设置为thisArg李>
否则,如果thisArg为null或未定义,请将ThisBinding设置为
全局对象李>
否则,如果类型(thisArg)不是对象,请将ThisBinding设置为
ToObject(thisArg)李>
否则将ThisBinding设置为thisArg李>
让localEnv作为调用NewDeclarativeEnvironment的结果
传递[[Scope]]的值
F的内部性质
争论李>
将LexicalEnvironment设置为localEnv李>
将VariableEnvironment设置为localEnv李>
设code为F的[[code]]内部属性的值李>
使用函数代码执行声明绑定实例化
代码和参数列表如中所述
10.5
换句话说:要么指定它,要么将其自动设置为全局对象。它永远不会从父作用域继承this绑定,因此将父作用域的thisBindiong提供给其子作用域的唯一方法是
将其保存在父范围中的局部变量中,如varself=this
用call/apply注入它,就像你在问题中给出的代码一样
调用函数时,this
的值并不神秘,这取决于“正常”调用函数的方式(无调用
或应用
):
因此,为了避免“更改”此
的值,只需将正确的值传递给应用
,具体取决于您如何将其称为“正常”:
请注意,在ES6中,您还可以编写:
func(...someArray)
此处此
变为窗口
内的func
,这是无用的。但如果你写:
obj.func(...someArray)
内部func
中的该
将是obj
这可能是我5年前寻找的功能,但那是5年前的事了,所以谁还记得:)好吧,你可以将null
作为第一个参数传递。但是,在func
中,这个应该指什么?这个问题还不够清楚。请给出更多的代码。听起来你在函数中使用了这个
,但它不应该被使用。好的,我现在明白了。在我的例子中,我有一个对象的原型函数,我想用.apply()
调用它。我假设函数会以某种方式绑定到它的对象,所以我不想像apply那样更改它,但显然没有这样的连接,apply()
只处理调用它的函数。null不适用于实现ES5的浏览器的全局对象,因为“this”被调用函数中的值将为空。@gsnedders,说es5时要小心,因为只有在严格模式下才是这样。尽管如此,为了获得最佳兼容性,我已将答案改为未定义。干杯。嗯,如果你更深入地遵循算法,Function.prototype.apply下面的注释会有点误导…“thisArg值作为this值在未经修改的情况下传递。这是对第3版的更改,其中未定义或空的thisArg被替换为全局对象,ToObject被应用于所有其他值,结果作为This值传递。“@gsnedders,我不明白你的意思。要解释一下吗?对于ES5,这不是真的。This的值未定义(非空),这不会更改为全局对象(在with语句中实际上不是这样,但我现在将忽略它们)。对于ES3和ES5引擎,在with语句之外,steve.apply(未定义,[])
和steve()
是等效的,尽管它们的行为在ES3和ES5之间有所不同。@gsnedders,谢谢!我在spec()中找到的内容描述了此
设置为全局对象,而null
/未定义
为
func(...someArray)
obj.func(...someArray)