【发布时间】:2018-09-12 06:47:49
【问题描述】:
我在 Javascript 中有以下类:
cart.js
class Cart{
static addItem(data, beforeSendCallback=null, successCallback=null, errorCallback=null) {
const emptyCallback = ()=>{}
if(data){
$.ajax({
url: '/orders/',
type: 'POST',
data: data,
beforeSend: beforeSendCallback == null ? emptyCallback : beforeSendCallback,
success: successCallback == null ? emptyCallback : successCallback,
error: errorCallback == null ? emptyCallback : errorCallback,
dataType: 'json'
})
}
}
}
现在,我在另一个文件中:
item.js
...
function addItemToCart(e) {
e.preventDefault()
let data = {
'itemId': $('#item_id').val(),
'type': $('#item_type').val(),
'quantity': $('#quantity').val(),
'stock': $('#in_stock').val(),
'price': $('#item_price').val()
}
if (data.stock != 2) {
Cart.addItem(data, disableAddToCartBtn(true), disableAddToCartBtn(false))
}
}
...
当按下add-cart-btn 时,会执行此函数,但出现错误:
Uncaught ReferenceError: Cart is not defined, 在 HTMLAnchorElement.addItemToCart (item.js:20) 在 HTMLAnchorElement.dispatch (jquery.js:5206) 在 HTMLAnchorElement.elemData.handle (jquery.js:5014)
这两个文件被添加到app.js 中,app.js 负责通过 webpack 处理它们:
require('./core/cart')
require('./item')
因为我首先需要./core/cart,所以我认为它的内容可以用于./item,我错了吗?
【问题讨论】:
-
您的错误表明它正在浏览器中运行,但您使用
require()给出了一个示例,任何浏览器都不支持AFAIK。这里可能有很多缺失的信息。我假设您正在使用捆绑器?更多细节肯定会有所帮助。 -
每个模块都有自己的范围。您应该导出必要的类(使用
module.exports)并利用require的返回值。 -
如果你在浏览器中,一个简单的解决方法是在
cart.js中使用window.Cart = Cart -
@appleapple 应该避免污染全局命名空间,特别是如果您已经在模块环境中 - 解决方案是使用模块环境,而不是尝试解决它。
-
@CertainPerformance 我想说类可以安全地留在全局空间内。
const Cart = require('./core/cart');做同样的事情,只是在不同的空间内。
标签: javascript oop ecmascript-6 es6-class