【问题标题】:Why I can't invoke function inside of another function in JS, if functions are objects?如果函数是对象,为什么我不能在 JS 中的另一个函数内部调用函数?
【发布时间】:2021-08-15 09:20:14
【问题描述】:

我可以在对象内部调用函数,但我不能在函数内部调用函数。 它是如何工作的?

const baz = {
    bar() { console.log('hi');}
}

baz.bar(); // -> hi

function foo() {
    function bar() {
        console.log('there');
    }
}

console.log(foo.bar); // undefined, why???

【问题讨论】:

  • 为什么应该这样工作? foo 不是对象
  • @NicoHaase - 函数是 JavaScript 中的对象。
  • 你需要做的:foo.bar = function() {console.log('there')}
  • bar 不是foo属性

标签: javascript function object


【解决方案1】:

因为在第二个示例中,foo 上没有 bar 属性,但 foo.barfoo 对象上查找名为 bar 的属性。如果您的问题来自您的两个示例都使用 {},那么:在 JavaScript 中,{} 至少用于几个不同的事情:

  1. 分隔对象字面量,如您的第一个示例中所示
  2. 分隔函数主体,如第二个示例或块(例如,附加到 iffor 或类似的块)

这些是完全不相关的东西,它们只是看起来有点相似。 {} 还用于其他用途,例如指示命名导入 [import { x } from "y"]、对象解构 [虽然实际上这只是上面 #1 的反面],可能还有其他......)

还请注意,使用您的代码,bar 函数仅在 if 您调用 foo 时创建,并创建不同的 bar 函数每次拨打foo

可以将一个函数分配给另一个函数的属性,但不是这样。例如:

function foo() {
    console.log("foo");
}
foo.bar = function() {
    console.log("bar");
};
foo.bar(); // "bar"
foo();     // "foo"

这行得通,因为正如您所说,函数是对象,因此您可以向它们添加属性。

如果你想要更相似的声明式语法,你可以用函数创建一个对象,并通过Object.assign将它们复制到目标函数:

// Object.assign copies properties from the second argument onward
// onto the object in the first argument
const foo = Object.assign(
    // Function expression, creates a function:
    function foo() {
        console.log("foo");
    },
    // Object literal, creates an object:
    {
        bar() {
            console.log("bar");
        }
    }
);
foo.bar(); // "bar"
foo();     // "foo"

【讨论】:

  • 感谢您如此详细的回答!有趣的是,当我想从您的第二个 sn-p 中查看 foo 时,它显示没有 bar 功能,但是当我要求 foo.bar 时,我可以找到它。 console.log(foo); // ƒ () { console.log("foo");} // without bar console.log(foo.bar); // ƒ bar() { console.log("bar");}
  • @ForceAwakenz - 我的荣幸!没有看到 bar 属性:这取决于您使用什么工具来查看它。例如,Chrome(和相关)浏览器中的 devtools 只显示草书 f 后跟函数的字符串表示,这只是它的源代码,而不是它的其他属性(这也是你的从foo.toString() 获取),但Firefox 的开发工具会向您展示它的所有属性(包括barnamelength,...)。所以这只是你用来查看它的东西。 bar 属性没有什么不寻常的地方。编码愉快!
  • (嘿,重叠的 cmets - 显然您使用的是 Chrome 或相关的。:-))
猜你喜欢
  • 2017-01-04
  • 1970-01-01
  • 2019-09-11
  • 2015-07-10
  • 2017-09-22
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
相关资源
最近更新 更多