我需要帮助了解以下脚本的工作原理。
var foo = function() {
console.log("A");
}
(function() {
// Empty
})
当使用节点(v5.9.1)运行此脚本时,输出为" A" 。我希望它什么都不做。为什么 foo 在这里执行?我可以删除第一行或最后三行,然后没有输出。
;
,它会按预期工作。但为什么?答案 0 :(得分:8)
如果在函数表达式之后立即放置(...)
,则执行该函数。
问题中的代码定义了一个调用console.log
的函数。然后它调用该函数(向它传递一个函数,该函数无论如何都不做任何事情)。然后它将调用第一个函数的返回值赋给foo
。
可以改写为:
var function_a = function() {console.log("A");};
var function_b = function() {};
var foo = function_a(function_b);
...唯一的副作用是创建function_a
和function_b
变量。
分号插入通常被认为是有害的,因为它会导致人们期望空格将语句分成两个不相关的表达式。
JSHint会警告你这个问题:
7缺少分号。
答案 1 :(得分:2)
JavaScript将(...)
解释为对先前定义的函数的调用(请注意,您将另一个函数作为参数传递,在foo
中被忽略),因为}
和(
之间没有任何内容。 def update_product_price_details(product):
product.sale_price = product.original_price
if product.product_type == "PACKAGED_PRODUCT":
product_discount = ProductServices.get_product_discount(product) # TODO : handle multiple items
# calculate product sale price base on subproducts and its disocunt
product.original_price = 0
for sub_product in product.packagedproduct.sub_products.all():
sub_product = ProductServices.update_product_price_details(sub_product)
product.original_price = product.original_price + sub_product.sale_price
if product_discount and product_discount.is_valid():
product.sale_price = product.original_price - (product.original_price*product_discount.discount_percentage/100)
else:
product_discount = ProductServices.get_product_discount(product) # TODO : handle multiple items
# if valid discount set new price as sale_price
if product_discount and product_discount.is_valid():
product.sale_price = product.original_price - (product.original_price*product_discount.discount_percentage/100)
return product
符号。
答案 2 :(得分:1)
使用您的代码
var foo = function() {
console.log("A");
}
(function() {
// Empty
})
javascript解释器正在读这个:
var foo = function() {
console.log("A");
}(function() {});
对于解释器,您声明了一个匿名函数,并向它传递一个参数,它不返回任何内容,那么foo的值为undefined
这就是为什么在必要时将;
放在每一行非常重要的原因。