javascript - 使用 .call 与在 JavaScript 中传递 "this"

标签 javascript performance oop optimization

我知道如果你有一些 javascript 函数并且你想调用它使得在其中使用 this 不会引用直接调用它的对象你可以使用 func .call(thatObject,param,and,more,params...).

但假设您是 func 的编写者并且 func 的唯一用法是通过 func.call,
为什么不将其定义为开头:

function func(that,param,and,more,params...) {
   //and in here use *that* and not *this*
}

是的,它看起来不那么“酷”,因为它不是对象的方法, 但是嘿,如果 func 的唯一用法是通过 func.call,那么这一切似乎只是额外的代码和开销。

我是不是漏掉了什么?还是我在其中看到这种模式的源代码只是“过度面向对象”?

最佳答案

似乎有很大的性能差异。使用

func(){
  //code here, this.something
}
func.call(thatObject)

根据前几个测试,比使用慢大约 8 倍

func(that){
  //code here, that.something
}
func(thatObject)

自己测试一下,JSPerf here

但归根结底,速度本身很少是我们使用代码的最重要因素。代码既是为人设计的,也是为计算机设计的,我们需要向两者清楚地传达我们的意图。使代码最干净的是最好的,只要可行,我们就应该遵循约定。我个人更喜欢这里的第二种选择,但我认为一般惯例是第一种。所以我认为你在大多数情况下都使用 call,除非你需要尽可能快的代码或者约定发生变化。

关于javascript - 使用 .call 与在 JavaScript 中传递 "this",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20514363/

相关文章:

javascript - 如何使用 javascript 从文件中获取图像尺寸(高度、宽度)

Python 套接字 I/O 性能与其他语言的比较

mysql - SQL:关于构建表以适应 3D 数据的提示?

java - 为什么不直接为所有对象声明 Object 类呢?

ios - 面向对象 - 父类(super class)中的 iOS isEqual 方法,它对子类是否正常工作?

javascript - HTML 中的 iPhone 表单元素

javascript - 如何检查变量是否不是假值但 0 在 Javascript 中传递

javascript - 纹理不随对象旋转

performance - MongoDB 查找和删除 - 最快的方法

swift - Swift 中的只读可变字段