保存对立即调用的函数的引用

时间:2015-12-04 02:00:48

标签: javascript

您似乎无法立即将调用的函数表达式设置为变量:

var foo = function() {
  alert();
}(); // Immediately alerts 

foo(); // Returns "Uncaught TypeError: foo is not a function"

foo原来是未定义的 - 但为什么呢?有没有办法实际保存对立即调用的函数的引用?

3 个答案:

答案 0 :(得分:5)

  

您似乎无法立即将调用的函数表达式设置为变量

这是不正确的

  

foo原来是未定义的 - 但为什么呢?

您提供的代码会将IIFE的返回值分配给var foo = function() { alert(); return 5; }();

如果你有:

foo

5的值为var foo; (foo = function () { alert('works just fine'); })();

  

有没有办法实际保存对立即调用的函数的引用?

是的,但这不是组织代码的好方法:

function foo() {
  alert();
}

为什么在声明函数时需要立即调用表达式:

foo();

然后调用函数:

public function update_json_detail() {
    $post_data = $this->input->post("POST_ARRAY");
    $execute = array();
    foreach ($post_data as $data) {
        $execute[] = array(
            'ID'=> $data['0'],
            'MATERIAL' => $data['7'],
            'AC' => $data['8']
        );
    }

    print_r($execute);
    /* CODE TO INSERT BATCH */
    $callback = $this->m_admin->update_eir_to_cost($execute);
}

答案 1 :(得分:4)

除了zzzzBov建议的方法之外,您还可以使用命名函数表达式执行所需操作并从函数返回引用:

var foo = (function foo() {
  alert();
  return foo; // Return a reference to this function
}()); // Immediately alerts 

foo(); 

然而,如上所述,这似乎不是一个好主意。只需声明函数。

此外,即使不是必需的,将IIFE包装在括号中也被认为是好的形式,因此从一开始就明显它是IIFE。否则,直到你到达最后一行才明白。

答案 2 :(得分:0)

在调用函数的函数之后给出了(),并将该函数的值赋给变量foo。因此,当你试图在下一次调用它时,它表示未捕获的类型函数。只需删除括号。

var foo = function() {
   alert();
};