JavaScript对象数组使用及函数调用相关两个语法问题咨询
JavaScript购物车总价计算功能相关问题
场景说明
当前需求为构建存储水果名称、单价、购买数量的对象数组,实现购物车总价计算功能,初始可运行代码如下:
cartTotal([ { name: 'Apple', price: 4, quantity: 2 }, { name: 'Orange', price: 3, quantity: 3 } ]); function cartTotal(cartArray) { let total = 0; cartArray.forEach(function(cartItem) { total = total + cartItem.price * cartItem.quantity; }); console.log(total); }
问题1:函数调用时为什么不能在首行加等号写成cartTotal = ([的形式?
这是混淆了变量赋值语法和函数调用语法的规则:
- 你参考的带等号的写法是标准的变量声明赋值场景:
let todos = [xxx]的作用是把等号右侧的数组,赋值给左侧声明的todos变量,等号是赋值操作的必要语法组成,少了等号反而会报错。 - 而
cartTotal([xxx])是函数调用语句,语法规则就是函数标识符(传入参数),函数名和包裹参数的括号之间不能插入等号。如果强行加等号写成cartTotal = ([xxx]),语义会完全改变:JS引擎会把这行代码识别为「把右侧的数组赋值给cartTotal变量」,根本不会触发函数执行;如果当前作用域没有提前声明cartTotal变量,严格模式下还会直接抛出引用错误。
问题2:为什么函数定义的名称必须和调用时的名称一致,改名就无法运行?
用function 函数名(参数){}的语法定义函数时,本质是在当前作用域里,把函数体和你写的函数名做了绑定。调用函数时,JS引擎会严格按照你写的名称,去作用域里查找对应的绑定内容:
- 如果定义时函数名叫
cartTotal,调用时笔误写成cartToal,引擎找不到对应名称绑定的函数,就会直接抛出「未定义」的引用错误,代码自然无法正常运行。 - 简单说就是名称是JS查找对应函数的唯一标识,写错名字就相当于找错了门牌号,肯定找不到目标函数。
内容的提问来源于stack exchange,提问作者little_Tiny_Cat_Pace
相关产品推荐
相关产品推荐

