Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在函数中解构数组失败,返回“0”;“let”是不定义的;?_Javascript_Node.js_Ecmascript 6 - Fatal编程技术网

Javascript 在函数中解构数组失败,返回“0”;“let”是不定义的;?

Javascript 在函数中解构数组失败,返回“0”;“let”是不定义的;?,javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,我想在函数中分解数组 下面的示例将数组作为单个参数传递,然后尝试在函数内对参数进行分解。看起来很简单,但节点抛出了一个错误 // volume.js function volume(box) { let [x,y,z] = box; return x * y * z; } volume([2,3,4]); 使用$node volume.js(v5.1.1)运行该命令将返回以下错误: ./volume.js:2 let [x,y,z] = box; ^ ReferenceEr

我想在函数中分解数组

下面的示例将数组作为单个参数传递,然后尝试在函数内对参数进行分解。看起来很简单,但节点抛出了一个错误

// volume.js
function volume(box) {
  let [x,y,z] = box;
  return x * y * z;
}

volume([2,3,4]);
使用
$node volume.js
(v5.1.1)运行该命令将返回以下错误:

./volume.js:2
  let [x,y,z] = box;
  ^

ReferenceError: let is not defined
    at volume (./volume.js:2:3)
    at Object.<anonymous> (./volume.js:5:1)
    at Module._compile (module.js:425:26)
    at Object.Module._extensions..js (module.js:432:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:313:12)
    at Function.Module.runMain (module.js:457:10)
    at startup (node.js:138:18)
    at node.js:974:3
/volume.js:2
设[x,y,z]=box;
^
ReferenceError:未定义let
在体积上(./volume.js:2:3)
反对。(/卷js:5:1)
在模块处编译(Module.js:425:26)
在Object.Module.\u extensions..js(Module.js:432:10)
在Module.load(Module.js:356:32)
在Function.Module.\u加载(Module.js:313:12)
位于Function.Module.runMain(Module.js:457:10)
启动时(node.js:138:18)
在node.js:974:3

还有其他方法可以解决这个问题,但我不明白上面的例子为什么不起作用。为什么这会抛出一个错误?
怎么能让
不被定义

对vanilla node v5.1.x来说,解构不起作用,因为解构仍然被视为“正在进行”的功能

未定义
let
ReferenceError,因为块作用域声明当前未定义

因此,要使上述代码正常工作,需要使用
harmony\u destructuring
标志调用节点,并且代码需要在严格模式下运行。将
“use strict”
添加到文件顶部并运行以下操作:

$ node --harmony_destructuring ./volume.js
Node还提供了一个
--use\u strict
标志,但我更愿意为每个文件声明它

ES6/ES2015功能(当前版本为v5.1.1,由@Shashank在评论中引用)分为三类:

  • 配送-默认启用
  • 分阶段-几乎准备就绪,使用
    --harmony
    标志启用批量
  • 正在进行中-实验性,可单独启用
运行带有harmony标志的节点时,
节点--harmony
仅启用分段功能。需要单独启用正在进行的功能,如分解结构。以下是节点v.5.1.1中的进行中标志列表:

  • ——和声模块
    ——和声模块
  • ——harmony\u regexps
    ——harmony正则表达式扩展
  • -和谐\u代理
    -和谐代理
  • ——和谐函数
    ——和谐函数块作用域
  • --和声\u sloppy\u let
    -和声let处于sloppy模式
  • ——harmony\u unicode\u regexps
    ——harmony unicode regexps
  • --和谐反映
    -和谐反映API
  • ——和声分解
    ——和声分解
  • ——和声默认参数
    ——和声默认参数
  • ——harmony\u sharedarraybuffer
    ——harmony sharedarraybuffer
  • 和谐原子
  • ——harmony\u simd
    ——harmony simd

语法似乎正确。在Firefox中工作。您还需要在节点中设置标志才能获得ES6功能吗?根据今年早些时候的数据(上个月编辑),您需要为
let
设置
--harmony
标志。你在使用那个标志吗?我这么说的原因是因为这个页面:我尝试使用
node--harmony
node--harmony\u destructuring
与destructuring赋值一起使用,两者都给出了与使用node 4.2.2时相同的错误。然而,使用babel,它可以正确编译。使用
--harmony
运行不会改变任何东西。而且,我认为我们不再需要和谐旗了。Node/JS移动得非常快,答案中提到的v0.12版本是一些主要的版本,现在已经很旧了。ps,一旦Node中可以进行解构,您可以将其写成
函数卷([x,y,z]){return x*y*z;}
或者更好的
常量卷=([x,y,z])=>x*y*z