为什么要执行此功能?

时间:2016-06-09 09:09:04

标签: javascript node.js control-flow

我需要帮助了解以下脚本的工作原理。

var foo = function() {
    console.log("A");
}

(function() {
    // Empty
})

当使用节点(v5.9.1)运行此脚本时,输出为" A" 。我希望它什么都不做。为什么 foo 在这里执行?我可以删除第一行或最后三行,然后没有输出。

  • 编辑:如果我在第3行的大括号后放置;,它会按预期工作。但为什么?

3 个答案:

答案 0 :(得分:8)

如果在函数表达式之后立即放置(...),则执行该函数。

问题中的代码定义了一个调用console.log的函数。然后它调用该函数(向它传递一个函数,该函数无论如何都不做任何事情)。然后它将调用第一个函数的返回值赋给foo

可以改写为:

var function_a = function() {console.log("A");};
var function_b = function() {};
var foo = function_a(function_b);

...唯一的副作用是创建function_afunction_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

这就是为什么在必要时将;放在每一行非常重要的原因。