【问题标题】:what's the benefit of binding to `undefined` instead of `null`绑定到“未定义”而不是“空”有什么好处
【发布时间】:2015-04-17 17:48:22
【问题描述】:

我经常看到,当需要在没有特定上下文的情况下使用绑定参数调用函数时,undefined 往往比 null 更适合作为上下文选择,例如:

f.call(undefined, param1, param2)

优先于:

f.call(null, param1, param2)

我想知道这是否有任何特殊原因?

【问题讨论】:

标签: javascript


【解决方案1】:

绑定到undefined 而不是null 有什么好处?

我认为没有。来自10.4.3 Entering Function Code

  1. 如果功能码为strict code,则将ThisBinding设置为thisArg
  2. 如果 thisArgnullundefined,则将 ThisBinding 设置为全局对象。
  3. ...

所以,如果代码不严格,在这两种情况下this 都会被设置为全局对象。

但如果代码是严格的,this 实际上将是 nullundefined。可以实现f 来区分这些情况,但这对我来说似乎不太可能发生。

【讨论】:

  • 我明白了,谢谢。所以我不妨像以前一样使用null,因为我将undefined视为我没有接触过的东西并尽量在我的应用程序中避免它,而null表示该值是故意设置的.当我调用该函数时,我是在故意设置上下文。
  • 对我来说听起来很合理! (我也是这样做的)
  • 为了完整起见,摘自ecma脚本第三版ecma-international.org/publications/files/ECMA-ST-ARCH/…The caller provides the this value. If the this value provided by the caller is not an object (including the case where it is null), then the this value is the global object
【解决方案2】:

在 javascript 中,undefined 超出了未设置值的场景。例如,如果您正在查找模型上不存在的属性,它将产生 undefined。

有这样的代码也没那么奇怪:

变量 k;

//做某事(可能设置k)

警报(k);

如果该值没有被设置,它将是未定义的而不是空的。

长话短说,它仍然是一种偏好,但通过使用 undefined,您更有可能捕捉到值尚未初始化或尝试访问不存在的对象的属性的情况。

不确定这是否能回答您的问题。

【讨论】:

  • 这并不能真正解释为什么在.call 的上下文中使用另一个。
  • 谢谢,但它不能回答我的问题,因为我很擅长区分 nullundefined :)
  • 我同意它的概念更多。这个想法可能是,由于不能为“this”赋予绑定函数任何值(并且“null”实际上是一个值本身),“未定义”更有意义(有点“根本没有值,因为没有值很重要”[假设 null 作为没有对象引用的值,而不是没有有效值])。
猜你喜欢
  • 2023-01-30
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
相关资源
最近更新 更多