代码之家  ›  专栏  ›  技术社区  ›  brandon

块、对象、未定义键、未定义函数

  •  -1
  • brandon  · 技术社区  · 3 周前

    简短的版本:它看起来是一个函数调用,但被解释为一个函数定义。为什么?

    注:x不是在执行之前定义的。这些代码示例也在节点终端中运行。要使它们在浏览器中运行,您需要在其前面加上 someVar= 或者用parens包起来。。。不知道为什么。。。但这不是我的主要问题。

    我有这段代码

    {x(arg){console.log('Hello '+arg)}}.x('world')

    这似乎相当于这段代码

    {x:(arg)=>{console.log('Hello '+arg)}}.x('world')

    为什么这样做的原因、用例或历史是什么?我一辈子都不明白为什么在第一个例子中,当提供函数执行语法时,它不尝试调用函数,看到它是未定义的,并抛出错误。此外,javascript创建了一个对象,该对象具有未定义函数名的键,参数与传递的参数匹配,body作为此函数调用之后的块。这是什么特殊的背景?

    我试着运行这个,并预期会出现错误,但我得到了意外的行为。我知道,一个包含逗号分隔的变量列表的对象文字会创建一个键与这些变量同名的对象,但这种行为似乎不止于此。

    2 回复  |  直到 3 周前
        1
  •  0
  •   Josh    3 周前

    这里有几件事:

    1. 有一个对象( someVar )通过对象文字来定义。
    2. 在对象中,有一个属性(名为“x”),它是一个函数(也称为方法)。该方法采用的一个参数 arg .
    3. 对象文字关闭后,直接使用点表示法调用对象属性(“x”方法)并传递参数。

    如果添加换行符,阅读起来会更容易一些:

    const someVar = {
        x(arg){
            console.log('Hello '+arg)
        }
    }.x('world')
    

    同样的函数也可以这样写,而且更清晰一点:

    const someVar = {
        x: function(arg) {
            console.log( `Hello ${arg}` )
        }
    }.x('world')
    

    或者另一种更简单的方法,将对象定义与函数执行解耦:

    // define the object
    const someVar = {
        x: function(arg) {
            console.log( `Hello ${arg}` )
        }
    }
    
    // call the method
    someVar.x('Hello')
    
        2
  •  0
  •   Danny    3 周前

    这是一个“对象文字方法定义”,这就是它工作的原因。
    看看这个

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer#method_definitions

    // Shorthand method names
    const object = {
      property(parameters) {},
    }