javascript - 函数参数传递和返回

标签 javascript

  var foo = {
    bar: function() { return this.baz; },
    baz: 1
  };
  (function(){
    return typeof arguments[0]();
  })(foo.bar);

为什么这段代码返回undefined

我假设 arguments[0] 会保存 foo.bar,这是一个函数。当通过 arguments[0]() 调用时,它应该返回函数评估的结果,在本例中为 1。因此,typeof arguments[0]() 应该返回“Number”(如 typeof 1)。相反,它返回 undefined。为什么?

最佳答案

理解为什么this不是对函数所在对象的引用,您必须了解 JavaScript 没有类。它有功能。

在 JavaScript 中,函数永远不会像在 Java、C# 等有类语言中那样严格地“绑定(bind)”到对象。 JavaScript 函数只是另一种类型,例如 stringnumber ,这意味着您可以像任何其他类型一样在变量中传递函数。在您的示例中,foo.bar 中包含的函数不知道foo根本。这只是一个功能,管好自己的事。

那么 this 是什么意思?关键字做什么?它指向执行上下文。在您的示例中,您调用 foo.bar 中的函数来自全局范围(即 window ),这就是它所指向的。您可以使用 apply()在正确的范围内调用函数,但为此您需要访问该范围(在本例中为 foo 对象)。这否定了仅传递函数而不传递对象的任何安全优势。

为了“解决”这个“问题”,ECMAScript 5(JavaScript 的 future 版本)引入了 bind() 。这个方便的函数允许您在将函数传递给另一个函数之前将它绑定(bind)到某个执行范围,如下所示:

var foo = {
    bar: function() { return this.baz; },
    baz: 1
};

var callback = foo.bar.bind(foo);

(function(){
    return typeof arguments[0]();
}(callback));

关于javascript - 函数参数传递和返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8587730/

相关文章:

javascript - 如何在 HTML5 Canvas 中展开模糊滤镜半径?

javascript - 将函数的参数提取到全局范围(javaScript)

javascript - Strongloop自定义脚本不退出

javascript - 如何在javascript中进行封装

javascript - 使用 Firestore 显示简单的博客文章

javascript - 有什么方法可以检测有多少浏览器窗口可见?

javascript - onKeyUp 不起作用?也许这是错误的ajax代码?

javascript - 多个类与 Jquery 映射并加载内容

javascript - Three.js 在删除和创建对象后变得非常慢

javascript - 所选选项值的 jquery 验证警报