Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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
在Javascript中,有相当于.apply的不';你不能改变这个值吗?_Javascript_Function_Arguments_Apply - Fatal编程技术网

在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提供给其子作用域的唯一方法是

  • 将其保存在父范围中的局部变量中,如var
    self=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)