为啥使用javascript函数包装器(在coffeescript中添加)“.call(this)”

Posted

技术标签:

【中文标题】为啥使用javascript函数包装器(在coffeescript中添加)“.call(this)”【英文标题】:Why use the javascript function wrapper (added in coffeescript) ".call(this)"为什么使用javascript函数包装器(在coffeescript中添加)“.call(this)” 【发布时间】:2011-05-31 09:16:52 【问题描述】:

当我使用最新 (1.0) 版本的咖啡脚本时,一个简单的 javascript 输出看起来像这样(默认情况下):

(function() 
  var a;
  a = 1;
).call(this);

.call(this) 有什么作用以及添加它的原因是什么?

【问题讨论】:

你能告诉我们产生这个js的代码吗? 我的猜测是,这是让所有变量默认具有局部函数(而非全局)作用域并通过 'this' 访问父作用域的最简单方法 这是一篇关于 JS 命名空间主题的优秀文章:javascriptweblog.wordpress.com/2010/12/07/… @Gabi Purcaru:这将由 CoffeeScript a = 1 生成。 如果您想知道为什么使用.call(this) 而不是普通的IIFE 调用,请参阅my answer 上的“为什么在javascript 匿名函数的末尾写“.call(this)”?” 【参考方案1】:

它正在创建一个函数,然后使用父函数/对象范围调用自身。

.call 和 .apply 是调用函数的不同方法。您基本上创建了一个函数,除了在自己的范围内设置 a=1 之外什么都不做。

在javascript中你需要意识到每个函数都是一个对象,this是指当前的对象/函数。使用 .call(this) 覆盖函数内的 this 并将其替换为调用上下文中的 this

【讨论】:

【参考方案2】:

这是一种确保编译后的 CoffeeScript 有自己的变量名范围的方法。这在效率和简单性方面有好处(您知道生成的 JavaScript 不会踩到其他代码使用的变量)。您可以使用 CoffeeScript 编译器的--bare(或-b)选项禁用它。

call(this) 的原因只是为了确保 CoffeeScript 与放置它的作用域具有相同的 this,因为函数通常不会从周围的上下文中继承它们的 this 对象。

【讨论】:

这与自执行函数有何不同?比如:(function() /* 代码 */ )(); 自执行函数失去了 this 的概念,当它没有在浏览器上下文中加载时。一些 CommonJS 平台使用特定的 this 评估加载的文件。 我完全理解变量范围的原因,但我很想知道如何提高效率。您是指编译器的效率,还是生成的 JavaScript 的效率?

以上是关于为啥使用javascript函数包装器(在coffeescript中添加)“.call(this)”的主要内容,如果未能解决你的问题,请参考以下文章

如何可视化 JavaScript 包装器对象?

从 Javascript 调用包装器函数会导致应用程序崩溃 - React-Native

为啥使用 Nginx 运行 Flask 需要 WSGI 包装器?

为啥这个 PySide2 构建找不到生成的 C++ 包装器?

为啥apache thrifts 传输层分为低级传输和传输包装器

为啥在比较 Java 中的整数包装器时 128==128 为假但 127==127 为真?